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);

程序运行如下:

9aeb7e3ce8eb83c45e8004fe331f00b2.png

源代码已挂到gitee上面,地址:

https://gitee.com/XiongYunSehng/csharp_socket_learning

技术群:添加小编微信并备注进群

小编微信:mm1552923   

公众号:dotNet编程大全      

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值