我正在编写一个简单的 C#服务器和客户端,但它在客户端断开连接时不会抛出异常。它将继续从客户端读取,认为客户端仍在那里。当客户离开时,它也不再阻止。如果客户端不再可用,我希望它会抛出异常。
private TcpListener server;
private NetworkStream stream;
private TcpClient client;
private byte[] buffer = new byte[1];
server = new TcpListener (serverIp, _portNumber);
server.Start();
stream = client.GetStream();
//我希望在客户端消失时抛出异常,但不是。
try
{
stream.Read(buffer,0,1);
}
catch(Exception e)
{
#if (DEBUG)
Debug.Log ("Failed Rading " + e.Message);
#endif
return 0;
}
任何帮助都将不胜感激。
答案 0 :(得分:0)
当连接关闭且缓冲区中没有更多数据要读取时,它应该抛出异常。显然仍有数据可用。当缓冲区和连接关闭时,您应该得到一个例外。 我也看到你当时读取数据1个字节。为什么不先检查连接是否存活:
client.Client.Poll(0, SelectMode.SelectRead)
检查是否有可读取的数据并读取正确的数量:
int available = client.Client.Available;
if(available > 0)
{
var buffer = new byte[available];
client.Read(buffer, 0, available);
}
答案 1 :(得分:0)
如果客户端在没有通知服务器的情况下离开,除了超时之外没有什么可以做的。服务器无法找到客户端消失的事实。
你需要忍受这个事实。设置超时。