C#NetworkStream不会抛出异常

时间:2014-10-20 09:37:34

标签: c# exception-handling network-programming tcpclient tcplistener

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

任何帮助都将不胜感激。

2 个答案:

答案 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)

如果客户端在没有通知服务器的情况下离开,除了超时之外没有什么可以做的。服务器无法找到客户端消失的事实。

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