C#NetworkStream不会抛出异常

本文关键字:抛出异常 C#NetworkStream | 更新日期: 2023-09-27 18:27:04

我正在编写一个简单的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; 
}

如有任何帮助,我们将不胜感激。

C#NetworkStream不会抛出异常

如果客户端在没有通知服务器的情况下离开,那么除了超时之外,您什么都不能做。服务器无法发现客户端已不在的事实。

你需要接受这个事实。设置超时。

当连接关闭并且缓冲区中没有更多数据可读取时,它应该抛出异常。显然还有可用的数据。当缓冲区和连接关闭时,应该会得到一个异常。我还看到你一次读取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);
}