当前位置: 首页 > 编程语言 > C#

TcpListener:检测客户端断开连接,而不是客户端暂时不发送任何数据分享

时间:2023-04-10 15:04:57 C#

C#学习教程:TcpListener:Detectclientdisconnection,insteadofclienttemporarynotsendinganydatashare如何检测“客户端断开连接”的时间。所有答案似乎都与此类似:TcpListener:Howtodetectclientdisconnect?基本上,从流中读取,如果Read()返回0,则客户端已断开连接。但这是假设客户端在每次发送数据流后断开连接。我们在TCP连接/断开开销缓慢且昂贵的环境中运行。我们建立连接,然后发送一些请求。伪代码:client.Connect();客户端.GetStatus();客户端.DoSomething();客户.DoSomethingElse();客户端.AndSoOn();客户端断开连接();Connect和Disconnect()之间的每次调用都会将数据流发送到服务器。服务器知道如何解析和处理流。如果让TcpListener在不断开连接的情况下循环读取,所有的消息都被读取和处理,但是在客户端断开连接之后,服务器是无从得知的,它永远不会释放客户端并接受新的。varread=client.GetStream().Read(buffer,0,buffer.Length);if(read>0){//Process}如果我让TcpListener在read==0时删除客户端,它只接受第一个A数据流,之后立即删除客户端。当然这意味着新客户端可以连接。调用之间没有人为延迟,但当然调用之间的时间在计算机时间方面是“巨大的”,所以总是会有read==0的时间,即使这并不意味着客户端已经或应该断开连接。varread=client.GetStream().Read(buffer,0,buffer.Length);if(read>0){//处理}else{break;//总是在接收到第一个数据流后立即执行}所以我想知道...是否有更好的方法来检测客户端是否已断开连接?您可以使用NetworkStream.Socket属性获取底层套接字并使用它的Receive方法进行读取。与NetworkStream.Read不同,Socket.Receive的连接重载将阻塞,直到读取了指定的字节数,并且只有在远程主机关闭TCP连接时才会返回零。更新:@jrh的评论是正确的,NetworkStream.Socket是受保护的属性,在此上下文中不可访问。为了获得客户端的Socket,可以使用TcpListener.AcceptSocket方法,该方法返回新建立的连接对应的Socket对象。艾伦的回答为我解决了这个问题。如果其他人遇到同样的问题,这里有一些使用Socket.Receive方法的“示例”代码:client.ReceiveTimeout=20000;}抓住{回报;}while(true){byte[]buffer=newbyte[client.ReceiveBufferSize];int读取=0;尝试{read=client.Receive(buffer);}抓住{休息;}if(read>0){//处理数据}else{break;}}if(client!=null)client.Close(5000);您在某个循环中调用AcceptClientAndProcess()。下面一行:read=client.Receive(buffer);将阻塞,直到最后两种情况中的任何一种表明客户端不再连接。还需要尝试捕获Socket.Accept()方法,因为如果客户端连接在连接阶段突然关闭,它可能会失败。请注意,确实为读取操作指定了20秒的超时。NetworkStream.Read的文档没有反映这一点,但根据我的经验,如果端口仍然打开并且没有数据可用,“NetworkStream.Read”将被阻止,但如果端口关闭则返回0。我从另一端遇到了这个问题,因为如果当前没有可用数据,NetworkStream.Read不会立即返回0。您必须使用NetworkStream.DataAvailable来确定NetworkStream.Read可以立即读取数据。以上是C#学习教程:TcpListener:检测客户端断开连接,而不是客户端暂时不发送任何数据共享。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: