C# socket服务端判断 客户端已经断开连接的一个小办法

本文介绍了一种基于Socket连接的客户端管理机制。重点讲解了如何利用Receive方法来监测客户端连接状态,当远程主机关闭连接且所有数据接收完毕时,Receive方法会返回零字节,据此可以判断客户端已断开。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具体原理就是:
If the remote host shuts down the Socket connection with the Shutdown method, and all available data has been received, the Receive method will complete immediately and return zero bytes.
中文翻译:如果远程主机关闭 Socket 与连接 Shutdown 方法,并且所有可用数据已被接收, Receive 方法将立即完成并返回零字节。

详见MSDN:跳转到MSDN

下面是一段示例代码,其核心就是这个Socket.Receive方法(好吧,在本例中使用的是”myClientSocket.Receive”)

private void ReceiveMessage(object clientSocket)
        {
            byte[] result = new byte[1024];
            Socket myClientSocket = (Socket)clientSocket;
            if (myClientSocket == null)
            {
                return;
            }
            string clientId = myClientSocket.RemoteEndPoint.ToString();
            if (string.IsNullOrWhiteSpace(clientId) || !myClientSocket.Connected)
            {
                return;
            }
            while (true)
            {
                try
                {
                    //通过clientSocket接收数据
                    if (!myClientSocket.Connected)
                    {
                        RemoveClient(clientId);
                        break;
                    }

                    myClientSocket.ReceiveTimeout = 100000; //设置超时时间,如果超过此时间没收到客户端的心跳数据,则端口客户端连接

                    //receiveNumber 显示接收的字节数,当它等于0时,说明已经接收完所有可用数据,并且断开了socket的连接
                    int receiveNumber = myClientSocket.Receive(result);
                    string msg = Encoding.Default.GetString(result, 0, receiveNumber);
                    if (receiveNumber == 0)
                    {
                        //看这个receiveNumber, 当它等于0的时候,说明已经断开了客户端的连接

                        //这里代码不全,就权当看个意思~
                        RemoveClient(clientId);
                        break;
                    }
                    else if (!string.IsNullOrWhiteSpace(msg)
                        && msg.Length == 1
                        && msg[0] == (char)5 //查询字符串
                        )
                    {
                        //说实话我不太知道这个else if作用是啥,就先放这以后研究吧~
                        myClientSocket.Send(Encoding.Default.GetBytes(new char[] { (char)4 }));

                    }
                    else
                    {
                        myClientSocket.Send(Encoding.Default.GetBytes(string.Format("收到客户端{0}的消息:{1}", clientId, msg)));

                    }
                }
                catch (Exception ex)
                {

                }
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值