1

我有一个服务器/客户端应用程序。

两者在通信时都使用 BinaryReader/Writer。

当客户端和服务器快速交换消息时,很多是在一秒钟内,我关闭服务器(通过内置命令,有序关闭)大部分时间(但不总是)客户端的 BinaryReader.ReadString() 方法抛出一个EndOfStreamException,这很好。我不明白的是为什么这个异常不将 TcpClient.Connected 属性更改为“false”?

while(true){
   try{
      BinaryReader.ReadString()
   }
   catch(IOException){
     if(!TcpClient.Connected)
        break;
     //BinaryWriter.Write() - this will, eventually, change Connected property to 'false'
   }
}

这将无限循环。我认为 Connected 属性会在网络读/写不成功时发生变化。如果 BinaryReader 抛出异常,那么它没有成功读取,是吗?

如果我输入 BinaryWriter.Write(),则无限循环将被打破,因为 Connected 属性更改为“false”。

相关问题,EndOfStreamException 是否总是表示网络连接中断,或者是否意味着临时问题?

4

1 回答 1

2

按设计。从 TcpClient.Connected 的 MSDN 库文章的备注部分:

因为 Connected 属性仅反映最近操作时的连接状态,所以您应该尝试发送或接收消息以确定当前状态。消息发送失败后,该属性不再返回true。请注意,此行为是设计使然。您无法可靠地测试连接的状态,因为在测试和发送/接收之间的时间内,连接可能已经丢失。您的代码应假定套接字已连接,并优雅地处理失败的传输

您发现的解决方法是正确的。

于 2011-10-06T22:58:30.890 回答