1

我正在编写一个简单的C#服务器和客户端,但它不会在客户端断开连接时引发异常。它会继续从客户那里读取,认为客户仍然在那里。当客户不在时它也不再阻止。如果客户端不再可用,我希望它会抛出异常。C#NetworkStream不会抛出异常

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

我应该什么时候设置超时时间? – Programmer 2014-10-20 10:53:55

+0

选择假阳性和假阴性之间的良好折衷。取决于网络以及您需要多快来检测掉线连接。在大多数情况下,合理的值是[1,30]秒。另外,要明白,在所有情况下,没有其他方式可以检测到失败的连接。超时是唯一可能的全面解决方案。 – usr 2014-10-20 11:15:28

+0

你介意发布一个代码片段吗? TcpClient和NetworkStream类都具有超时功能。我应该设置哪些? – Programmer 2014-10-20 11:42:29

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); 
} 
+0

if(server.Client.Availabe)听起来很棒,但Client.Available部分没有在任何地方定义。我有一些错误。 – Programmer 2014-10-20 10:23:52

+0

可用不是有用的值。如果返回0,则不知道确实没有可用的数据。此外,您无法以任何方式可靠地检查连接中断。 – usr 2014-10-20 10:36:55

+0

您是否包含套接字名称空间? http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx – Taxos 2014-10-20 11:07:08