【发布时间】:2012-07-24 15:27:38
【问题描述】:
我正在研究如何在使用 TcpListener 时检测“客户端断开连接”。
所有的答案似乎都与这个相似: TcpListener: How can I detect a client disconnect?
基本上,从流中读取,如果 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 在读取 == 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
}
所以我想知道...有没有更好的方法来检测客户端是否已断开连接?
【问题讨论】:
标签: c# tcplistener