如何确定TcpClient连接何时断开并重新连接

时间:2018-04-09 15:54:07

标签: c# sockets

编辑:我理解这个问题,但需要一个代码示例来说明如何解决它。

我希望我的客户端在断开连接后自动重新连接,但似乎TcpClient.Connected不可靠。我已经读过你需要发送类的数据来改变那个标志。有没有更好的方法来处理问题?

//Method to handle reading data from buffer and deserializing
public static async Task<Message> ReadMessageAsync(this TcpClient client)
{
    if (client.Connected && client.Available > 0)
    {
        int totalBytesRead = 0;
        var data = new byte[client.Available];

        while (totalBytesRead < client.Available)
        {
            totalBytesRead += await client.GetStream().ReadAsync(data, 0, client.Available);
        }

        return BinarySerializer.DeserializeMessage(data) as Message;
    }

    return null;
}

public async Task Start()
{
    ConnectToServer();

    while (_isRunning)
    {
        // Reconnect to server if needed.
        if (!_tcpClient.Connected)
        {
            ConnectToServer();
        }

        // Wait for data
        var data = await _tcpClient.ReadMessageAsync();
            HandleData(data);
    }
}

1 个答案:

答案 0 :(得分:0)

TCP是一种非常强大的协议,允许强大的编程。对于客户端,您不需要依赖网络接口的低级信令,协议/语言提供您所需要的一切(除非您的客户端对时间要求严格,需要立即通知网络故障):

正在连接

  • 如果连接失败,请再次尝试(在适当的超时后)或放弃

接收

  • 设置适当的接收超时并相应地执行 抛出超时异常(关闭套接字并重新开始 再次或放弃,或通知用户或...)。将“发出信号”表明服务器已经死亡,或者互联网已经死亡或者......
  • 检查收到的字节数== 0(表示正常断开连接 来自另一方,FIN)并据此采取行动
  • 如果对方发送RST,您将获得异常,处理该异常 相应地。