我正在寻找如何在使用TcpListener时检测“客户端断开连接”。
所有答案都与此类似: TcpListener:如何检测客户端断开连接? 基本上,从流中读取,如果Read()返回0,则表示客户端已断开连接。
但这是假设客户端在发送每个数据流后都会断开连接。 我们在TCP连接/断开开销慢且昂贵的环境中运作。
我们建立连接,然后发送多个请求。
伪代码:
如果我让TcpListener在读取为0时放弃客户端,它只接受第一次数据流后立即放弃客户端。当然,这意味着新客户端可以连接。
虽然两个调用之间没有人为延迟,但是在计算机时间方面,两个调用之间的时间“巨大”,因此总会有一个时间读数为0,尽管这并不意味着客户端已经或应该被断开连接。
所有答案都与此类似: TcpListener:如何检测客户端断开连接? 基本上,从流中读取,如果Read()返回0,则表示客户端已断开连接。
但这是假设客户端在发送每个数据流后都会断开连接。 我们在TCP连接/断开开销慢且昂贵的环境中运作。
我们建立连接,然后发送多个请求。
伪代码:
client.Connect();
client.GetStatus();
client.DoSomething();
client.DoSomethingElse();
client.AndSoOn();
client.Disconnect();
每次连接和断开连接()之间的通信都会向服务器发送一系列数据流。 服务器知道如何分析和处理这些数据流。
如果让TcpListener在循环中读取而不断开连接,则它将读取和处理所有消息,但是在客户端断开连接后,服务器无法得知并且它永远不会释放客户端并接受新的客户端。
var read = client.GetStream().Read(buffer, 0, buffer.Length);
if (read > 0)
{
//Process
}
如果我让TcpListener在读取为0时放弃客户端,它只接受第一次数据流后立即放弃客户端。当然,这意味着新客户端可以连接。
虽然两个调用之间没有人为延迟,但是在计算机时间方面,两个调用之间的时间“巨大”,因此总会有一个时间读数为0,尽管这并不意味着客户端已经或应该被断开连接。
var read = client.GetStream().Read(buffer, 0, buffer.Length);
if (read > 0)
{
//Process
}
else
{
break; //Always executed as soon as the first stream of data has been received
}
我在想...是否有更好的方法来检测客户端是否已经断开连接?
socket = listener.AcceptSocket(); s = new NetworkStream(socket); if (s.Read(..) == 0) ClientDisconnected();
的代码似乎对我来说运行良好。 - undefined