我的代码中发生了非常奇怪的事情。我正在开发一个C#聊天客户端-服务器应用程序。当我关闭服务器时,我希望客户端自动关闭。客户端正在使用StremReader从TcpClient对象读取。客户端处于while循环中,在该循环中,它读取一行(StreamReader.ReadLine()),然后对其读取的行进行一些操作。
当服务器关闭时,我还关闭了服务器端的tcp连接。因此,我希望客户端看到由readline引起的SocketException,将其捕获并退出。但是,异常不会被捕获!
这是客户端循环代码:
while (true)
{
try
{
ricev = read.ReadLine();
}
catch(SocketException exc)
{
//It never gets in here
}
chat.Invoke(showMessage, ricev);
}
当我关闭服务器时,Visual Studio告诉我,System.dll中出现了“System.Net.Sockets.SocketException”第一次机会异常,但是我无法捕获它。为什么会这样呢?我也试图用
catch
{
}
阻止,但这也不起作用。
任何帮助将不胜感激!
编辑:再尝试了几次之后,我实际上发现SocketException根本没有引发。就像我在评论中所说的那样,这真是太奇怪了,在相反的情况下,当客户端在服务器之前关闭时,就会引发异常,并且我可以取消它。
我真的不知道发生了什么...。
最佳答案
如果我很了解您的情况,那么当您在Stop
对象“TcpListener
”上调用_server.Stop()
方法时,当在流上调用SocketException
时,它不会在客户端抛出Read
……我不知道为什么会这样,但是我有周围的工作场所。这是通过访问Socket
上的基础TcpListener
并在其上调用Shutdown
来实现的:
_server.Stop();
_server.Server.Shutdown(SocketShutdown.Both);//now at your "read.ReadLine();" will throw SocketException
编辑:您在评论中说过:
如果要停止
tcpListerner
“_server.Stop()
”,然后关闭从clients
方法获取的_server.AcceptTcpCleint()
,则在reader.ReadLine()
处将抛出IOException: Unable to read data from the transport connection: A blocking operation was interrupted by a call to WSACancelBlockingCall
我自己对其进行了测试。关于C#SocketException不会被捕获,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6665563/