我正在寻找使用 TcpListener 时如何检测“客户端断开连接”。
所有的答案似乎都与这个相似: TcpListener:如何检测客户端断开连接?
基本上,从流中读取,如果 Read() 返回 0,则客户端已断开连接。
但这是假设客户端在它发送的每一个数据流之后断开连接。我们在 TCP 连接/断开开销既慢又昂贵的环境中运行。
我们建立一个连接,然后我们发送一些请求。
伪代码:
client.Connect();
client.GetStatus();
client.DoSomething();
client.DoSomethingElse();
client.AndSoOn();
client.Disconnect();
Connect 和 Disconnect() 之间的每次调用都会向服务器发送一个数据流。服务器知道如何分析和处理流。
如果让 TcpListener 在没有断开连接的情况下循环读取,它会读取并处理所有消息,但是在客户端断开连接后,服务器无法知道这一点,它永远不会释放客户端并接受新的消息。
var read = client.GetStream().Read(buffer, 0, buffer.Length);
if (read > 0)
{
//Process
}
如果我让 TcpListener 在 read == 0 时删除客户端,它只接受第一个数据流,然后立即删除客户端。
当然,这意味着新客户端可以连接。
调用之间没有人为的延迟,但是就计算机时间而言,两次调用之间的时间当然是“巨大的”,所以总会有一段时间 read == 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
}
所以我想知道......有没有更好的方法来检测客户端是否已断开连接?