Socket客户端与服务端通信_TCP和UDP

客户端与服务端通信主要有两种模式,一种是TCP,一种是UDP。

UDP速度最快,客户端只管发送,服务端是能接多少就接多少。一般应用到游戏行业。而TCP会保证两边能接收成功。下面做了一个简单的客户端与服务端通信的软信(聊天软件),以备后查:.

服务端:

1,创建监听端口

IPAddress ip = IPAddress.Any;
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint point = new IPEndPoint(IPAddress.Any, 1456);//监听端口为1456
socketWatch.Bind(point);
socketWatch.Listen(10);//最多接收10个客户端
textBox3.AppendText("启动服务成功");

2,需设置全局变量:

Socket? socketfwq;//服务端服务

Dictionary<string, Socket> keyValuePairs = new Dictionary<string, Socket>(); //把客户端的保存

要开启多线程监听:Accept()为等侍客户端接收,当有客户端连入时,把属性绑到combox上里,方便多个客户端通话。因为需环循监听,当监听到一个客户端后还要环循接收数据,所以需开启两个Task.Run。

byte[] buffer = new byte[1024];
Task.Run(() =>
{
    while (true)
    {
        socketfwq = socketWatch.Accept();
        keyValuePairs.Add(socketfwq.RemoteEndPoint.ToString(), socketfwq);
        BeginInvoke(new Action(() =>
        {
            comboBox1.Items.Add(socketfwq.RemoteEndPoint.ToString());
            comboBox1.SelectedItem = socketfwq.RemoteEndPoint.ToString();
        }));
        Task.Run(() =>
        {
            while (true)
            {
                int i = socketfwq.Receive(buffer);
                string relust = Encoding.UTF8.GetString(buffer, 0, i);
                BeginInvoke(new Action(() =>
                {
                    textBox3.AppendText("\r\n" + relust);
                }));
            }
        });
    }
});

3,服务端发送数据给客户端,有多个客户端,所以需选择combox1进行选择,而前面以已经用字典

Dictionary<string, Socket> keyValuePairs = new Dictionary<string, Socket>(); //把客户端的保存

所以直接调用字典发送。

keyValuePairs[comboBox1.SelectedItem.ToString()].Send(Encoding.UTF8.GetBytes(textBox4.Text));
textBox3.AppendText($"\r\n {comboBox1.SelectedItem.ToString()} :" + textBox4.Text);

客户端:

1,设置全局变量:static Socket? ClientSocket;//客户端

IPAddress.Parse("192.168.254.8")绑定服务器端,接口1456。connect进行接连。

当连接成功后就告知服务器客户端连接成功,然后就环循环接收数据。

ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse("192.168.254.8");
IPEndPoint endPoint = new IPEndPoint(ip, 1456);
ClientSocket.Connect(endPoint);
textBox2.AppendText("连接成功:" + ClientSocket.LocalEndPoint.ToString());
ClientSocket.Send(Encoding.UTF8.GetBytes($"\r\n {ClientSocket.LocalEndPoint.ToString()}:客户端连接成功"));
//comboBox1.Items.Add(ClientSocket.LocalEndPoint);
byte[] buffer = new byte[1024];
Task.Run(() =>
{
    while (true)
    {
        int i = ClientSocket.Receive(buffer);
        BeginInvoke(new Action(() =>
        {
            textBox2.AppendText($"\r\n{ClientSocket.RemoteEndPoint}:" + Encoding.UTF8.GetString(buffer, 0, i));
        }));
    }
});

2,客户端发送数据到服务端:

ClientSocket.Send(Encoding.UTF8.GetBytes($"{ClientSocket.LocalEndPoint.ToString()}:" + textBox1.Text));
textBox2.AppendText($"\r\n {ClientSocket.LocalEndPoint.ToString()} :" + textBox1.Text);

程序运行如下:

Socket客户端与服务端通信_TCP和UDP源代码已挂到gitee上面,地址:https://gitee.com/XiongYunSehng/csharp_socket_learning