我有一个服务器/客户端应用程序。
通信时都使用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是否始终指示网络连接断开或者是否意味着临时问题?
答案 0 :(得分:2)
按设计。来自MSDN Library文章的备注部分,用于TcpClient.Connected:
因为Connected属性仅反映了该状态 连接到最近的操作,你应该尝试发送 或接收消息以确定当前状态。消息后 发送失败,此属性不再返回true。请注意这一点 行为是设计的。你无法可靠地测试状态 连接因为,在测试和发送/接收之间的时间, 连接可能已丢失。你的代码应该假设 套接字已连接,并正常处理失败的传输
您发现的解决方法是正确的。