【问题标题】:C# NetworkStream wont throw exceptionC# NetworkStream 不会抛出异常
【发布时间】:2014-10-20 09:37:34
【问题描述】:

我正在写一个简单的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# exception-handling network-programming tcpclient tcplistener


    【解决方案1】:

    如果客户端在没有通知服务器的情况下离开,除了超时,你无能为力。服务器无法查明客户端已消失的事实。

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

    【讨论】:

    • 我应该设置什么时间超时?
    • 在误报和误报之间进行权衡。取决于网络以及检测断开连接所需的速度。在大多数情况下,合理的值是 [1, 30] 秒。此外,请了解没有其他方法可以在所有情况下检测失败的连接。超时是唯一可能的包罗万象的解决方案。
    • 你介意发布一个代码 sn-p 吗? TcpClient 和 NetworkStream 类都具有超时功能。我应该设置哪些?
    • 可能是 TcpClient 拥有的那个。我不知道从我的头顶。它应该很容易研究。
    • TcpClient.ReceiveTimeout = 3000;等待客户端消息 3 秒,然后继续运行。没有解决客户端断线时服务器还在等待的问题......
    【解决方案2】:

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

    【讨论】:

    • if(server.Client.Availabe) 听起来很棒,但是 Client.Available 部分没有在任何地方定义。我遇到了一些错误。
    • Available 不是一个有用的值。如果它返回 0,则您不知道确实没有可用数据。此外,您无法以任何方式可靠地检查断开的连接。
    • 您是否包含了套接字命名空间? msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx
    • 我做到了。我只发现 tcpclient.available 而不是 server.Client.Available。此外, tcpclient.available 不做任何事情。看来您必须向客户端发送消息才能确定它是否仍然连接。
    • 很抱歉,我现在看到您正在同一位置对客户端和服务器进行编程。在这种情况下,您必须调用 server.Server.Available 来查看服务器是否有可用数据,或者调用 client.Client.Available 来查看客户端是否有可用数据。
    猜你喜欢
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多