C# Socket之TCP 1.C# Socket之TCP服务器 2.C# Socket之TCP客户端 C# Socket的TCP通讯

需要引用using System.Net.Sockets; using System.Net;两个命名空间;

namespace TcpServer  //服务器
{
    class Program
    {
        public static List<Client> clientList = new List<Client>();
       
        static void Main(string[] args)
        {
            Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建socket对象
            tcpServer.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.145"), 8090));//绑定IP和申请端口

            tcpServer.Listen(100);//设置客户端最大连接数
            Console.WriteLine("服务器已启动,等待连接.........");
            while (true)//循环等待新客户端的连接
            {
                Socket clientSocket = tcpServer.Accept();
                Console.WriteLine((clientSocket.RemoteEndPoint as IPEndPoint).Address+"已连接");
                Client client = new Client(clientSocket);
                clientList.Add(client);
            }
        }
        public static void BroadcastMessage(string message, Client clientSocket)//这个函数用来广播接收到的客户端消息  参数1为消息,参数2为消息来源(客户端)
        {
            var onConnectedList = new List<Client>();//用来存储已断开服务器连接的客户端

            foreach (var client in clientList)//遍历已经存储的客户端
            {
                if (clientSocket == client)//如果该客户端是消息来源,则不重复发送消息给该客户端
                {
                    continue;
                }
                if (client.Connected)//判断该客户端的状态
                {
                    client.SendMessage(client.ip + ":" + message);//
                }
                else//把已断开连接的客户端放到数组中
                {
                    onConnectedList.Add(client);
                }
            }
            foreach (var temp in onConnectedList)//广播完之后从存储已连接客户端集合中移除掉已断开连接的客户端
            {
                clientList.Remove(temp);
            }
        }
    }
}

  

namespace TcpServer  
{
    class Client
    {
        private Socket clientSocket;
        private Thread t;
        public string ip = "";
        private byte[] data = new byte[1024];
        public Client(Socket socket)
        {
            clientSocket = socket;
            ip = (clientSocket.RemoteEndPoint as IPEndPoint).Address.ToString();//获取客户端的ip
            t = new Thread(ReceiveMessage);//开启线程执行循环接收消息
            t.Start();
        }
        private void ReceiveMessage()//接收消息
        {
            int length = 0;//初始化消息的长度
            while (true)//循环接收消息
            {
                length = clientSocket.Receive(data);//获取存放消息数据数组的长度
                if (clientSocket.Poll(10, SelectMode.SelectRead))//????
                {
                    clientSocket.Close();
                    break;
                }
                if (length != 0)//判断是否有数组内是否存放消息数据
                {
                    string message = Encoding.UTF8.GetString(data, 0, length);//Byte转为string
                    Program.BroadcastMessage(message, this);//广播给其他客户端
                    Console.WriteLine("来自" + (clientSocket.RemoteEndPoint as IPEndPoint).Address + ":" + message);//输出到服务器控制台
                    length = 0;//归0
                }
            }
        }
        public void SendMessage(string message)//发送消息
        {
            byte[] data = Encoding.UTF8.GetBytes(message);
            clientSocket.Send(data);
        }
        public bool Connected//获取该客户端的状态
        {
            get { return clientSocket.Connected; }
        }
    }
}

  C# Socket之TCP
1.C# Socket之TCP服务器
2.C# Socket之TCP客户端
C# Socket的TCP通讯

2.C# Socket之TCP客户端

namespace TcpClient
{
    class Program
    {
        private static Thread  t;
        private static Socket clientScoket;
        private static byte[] data= new byte[1024];
        static void Main(string[] args)
        {
            ConnectToServer();//创建scoket对象并连接到服务器
           
            while (true)
            {
                string message2 = Console.ReadLine();
                SendMessage(message2);
            }
           
            Console.ReadKey();
        }
        static void ConnectToServer()
        {
            clientScoket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
             clientScoket.Connect(new IPEndPoint(IPAddress.Parse("192.168.1.145"), 8090));
            Console.WriteLine("已连接到服务器");
            t = new Thread(ReceiveMessage);//开启线程执行循环接收消息
            t.Start();

        }
        static void SendMessage(string message)//发送消息
        {
            byte[] data = Encoding.UTF8.GetBytes(message);
            clientScoket.Send(data);
        }
        static void ReceiveMessage()//接收消息
        {
            int length = 0;
            while (true)
            {
                if (clientScoket.Connected==true)
                {
                    length = clientScoket.Receive(data);
                    if (length != 0)
                    {
                        string message = Encoding.UTF8.GetString(data, 0, length);
                         Console.WriteLine(message);
                    }
                }
            }         
        }
    }
}

C# Socket的TCP通讯

 

Socket的TCP通讯

一、 socket的通讯原理

服务器端的步骤如下。

(1)建立服务器端的Socket,开始侦听整个网络中的连接请求。

(2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。

(3)当完成通信后,服务器关闭与客户端的Socket连接。

客户端的步骤如下。

(1)建立客户端的Socket,确定要连接的服务器的主机名和端口。

(2)发送连接请求到服务器,并等待服务器的回馈信息。

(3)连接成功后,与服务器进行数据的交互。

(4)数据处理完毕后,关闭自身的Socket连接。

二、 socket的通讯方式

socket通讯方式有两种:同步和异步

同步工作方式:

用TCP协议进行编程时程序执行到发送、接收和监听语句的时候,在未完成工作前不再继续往下执行,即处于阻塞状态,直到该语句完成某个工作后才继续执行下一条语句。

异步工作方式

程序执行到发送、接收和监听语句的时候,不论工作是否完成,都会继续往下执行。

Socket的TCP通讯

一、 socket的通讯原理

服务器端的步骤如下。

(1)建立服务器端的Socket,开始侦听整个网络中的连接请求。

(2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。

(3)当完成通信后,服务器关闭与客户端的Socket连接。

客户端的步骤如下。

(1)建立客户端的Socket,确定要连接的服务器的主机名和端口。

(2)发送连接请求到服务器,并等待服务器的回馈信息。

(3)连接成功后,与服务器进行数据的交互。

(4)数据处理完毕后,关闭自身的Socket连接。

二、 socket的通讯方式

socket通讯方式有两种:同步和异步

同步工作方式:

用TCP协议进行编程时程序执行到发送、接收和监听语句的时候,在未完成工作前不再继续往下执行,即处于阻塞状态,直到该语句完成某个工作后才继续执行下一条语句。

异步工作方式

程序执行到发送、接收和监听语句的时候,不论工作是否完成,都会继续往下执行。