我有一个服务器/客户端应用程序。网络套接字上的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总是指示一个断开的网络连接,或者它可能意味着一个临时问题?
我知道,我发现令人费解的是,读取失败并不会改变Connected属性。我可能无法阅读百万次,而Connected仍然是“真实的”。根据MSDN,读取或写入不成功将会更改Connected属性,但在我的示例中,读取失败时看起来是不真实的。 – user983110
看起来好像BinaryRead()一遍又一遍地读取相同的数据而不敲击套接字。但是这样会与BinaryRead()MSDN文档发生冲突,这似乎表明,读取数据失败后永远不会返回到流中。 – user983110
没关系,我现在得到它:) – user983110