假设您有2个应用程序,服务器和客户端。我在Visual Studio 2010的2个实例中同时调试它们。让我们说在客户端我打电话:
_reader.Close(); //BinaryReader
_writer.Close(); //BinaryWriter
_ssl.Close(); //SslStream taken from _stream
_stream.Close(); //NetworkStream from _client.GetStream();
_client.Close(); //TcpClient
我已通过调试器检查了此代码是否已执行。 在此之后,我还会通过其他指令触发客户端应用程序的关闭,实际上Visual Studio退出调试模式并返回标准模式。
在服务器应用程序中,由于连接实际上已关闭,因此挂起的_reader.Read()会失败,从而触发在try / catch中正确处理的异常。根据{{3}},这应该相应地更新TcpClient.Connected的值。
这不会发生:服务器中的另一个线程一直在检查_client.Connected,但它仍然是真的。
你应该注意:
1)如果我使用“停止”按钮关闭客户端,一切都无缝地工作,_client.Connected变为false
2)不知道这可能是相关的,但服务器侦听127.0.0.1并且客户端连接到127.0.0.1,因为我在一台PC上调试这两个应用程序
答案 0 :(得分:1)
仅当您调用“写入”或“读取”时才会更新“已连接”属性。
答案 1 :(得分:0)
我不知道这是否会让任何人感兴趣,但我会告诉你我是如何解决这个问题的。由于TcpClient.Connected似乎不可靠,(在某些情况下,即使在对基础流的读取尝试失败后仍然如此),而不是从TcpClient.Connected检查连接状态,我使用bool“已断开连接” 。
这样的bool值由从这样的TcpClient(通过BinaryReader)监听的线程管理:
当读取失败时 - >这意味着连接已关闭 - >生成异常并由try / catch优雅地处理,其中:
try
{
reader.Read();
}
catch
{
disconnect = true;
}