如何知道客户端何时与C#中的服务器断开连接?

时间:2010-05-20 09:45:18

标签: c# client-server

我在C#中有一个Client-Server程序 这是服务器的代码:

...
String dataFromClient =  "";
NetworkStream networkStream;
TcpClient clientSocket;
bool transfer = true;
...
while (transfer)
    {

         networkStream = clientSocket.GetStream();
         networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
         dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
         dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
         ....
     }

我想提出一个在客户端断开连接时停止循环的条件 我怎么能这样做?
非常感谢,

2 个答案:

答案 0 :(得分:3)

确实无法直接检测到这一点。你只能尽量减少“伤害”。

为什么不可能?

因为TCP流不发送任何数据来检查连接是否仍然存在(这会导致不必要的开销,但效益不大)。您必须手动启动此类检查。一个简单的想法是定期ping以查看连接是否仍在工作。

我该如何处理?

在尝试读/写之前,请务必检查Connected属性。这只是一个简单的健全性检查,Connected状态总是过时的(这是由于上面解释的性质,无法改变这一点)。

在任何情况下,您仍然需要始终处理连接异常 - 无法保证传输成功,如果连接已经丢失,您只能尝试避免写入。

如果您注意到传输失败,则必须以某种方式处理它。您可以缓存数据并尝试重新连接,然后再次发送。或者您可以忽略失败的传输。这取决于您的具体要求。

答案 1 :(得分:0)

如果不尝试发送一些数据是不可能的。

在stackoverflow上有一个很好的讨论,但我现在似乎无法找到它...