2011-10-06 70 views
1

我有一个服务器/客户端应用程序。网络套接字上的C#BinaryReader.ReadString

通信时都使用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(),然后无限循环被打破,因为连接属性更改为'假'。

相关的问题,一个EndOfStreamException总是指示一个断开的网络连接,或者它可能意味着一个临时问题?

回答

2

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

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

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

+0

我知道,我发现令人费解的是,读取失败并不会改变Connected属性。我可能无法阅读百万次,而Connected仍然是“真实的”。根据MSDN,读取或写入不成功将会更改Connected属性,但在我的示例中,读取失败时看起来是不真实的。 – user983110

+0

看起来好像BinaryRead()一遍又一遍地读取相同的数据而不敲击套接字。但是这样会与BinaryRead()MSDN文档发生冲突,这似乎表明,读取数据失败后永远不会返回到流中。 – user983110

+0

没关系,我现在得到它:) – user983110