如何在C#中创建可以从丢失的网络连接中恢复的TcpClient?

时间:2013-05-30 02:02:36

标签: c# tcpclient

我正在尝试编写一个TCP客户端线程,该线程将连接到服务器并在接收数据时继续处理数据。有时客户端将失去与服务器的连接。重新建立连接后,线程应恢复/恢复并再次自动开始处理数据。我似乎无法让这个工作。基本算法如下。我的问题是我只是不太明白网络连接丢失时TcpClient的行为。如何判断连接已丢失?那我需要关闭连接吗?如何重新建立连接并继续?

TcpClient _tcpClient;
IPEndPoint _ipEndPoint;
bool _cancelled = false;
bool _error = true;
while (!_cancelled)
{
  try
  {
    if(_error)
    {
      _ipEndPoint = new IPEndPoint(_myAddress, _myPort);
      _tcpClient.Connect(_ipEndPoint);
      _networkStream = _tcpClient.GetStream();
      _error = false;
    }
    else
    {
      _data = new byte[10025];
      if(_networkStream.CanRead)
      {
        _bytesRead = _networkStream.Read(_data, 0, (int)_tcpClient.ReceiveBufferSize);
        if(_bytesRead > 0)
        {
          ...process the data...
        }
        else
        {
          _error = true;
        }
      }
      else
      {
        _error = true;
      }
    }
  }
  catch(Exception ex)
  {
    ...log error...
    _error = true;
  }
}

1 个答案:

答案 0 :(得分:0)

TcpClient上有一个Connected属性,但只有在NetworkStream上执行Write或Read时才会更新。

如果您想强制进行连接检查,我认为您可以执行Read(null,0,0)或Write(null,0,0)。但是在示例中,您可以在_networkStream.Read完成后检查Connected或CanRead属性。

至于重新建立链接你会有什么工作。我建议在获取新网络流之前处理旧网络流。像这样:

if(_networkStream != null)
{
   _networkStream.Dispose();
}
_networkStream = _tcpClient.GetStream();

我所做的是启动重新连接计时器,该计时器将尝试在配置的时间间隔内重新连接。根据TcpHost,你连接到你甚至可能想要以500-1000ms的小间隔开始尝试,并且在给定次数的失败重试之后增加,这样你就不会浪费很多时间来尝试连接到已经消失的主机。然后在最大尝试次数之后放弃,除非用户明确要求再次尝试。但这也取决于你的应用程序正在做什么,如果连接是它的唯一目的,或者只是它的一个。

我用来与TcpClient交互的包装类大约有700行代码,它处理重新连接,发送数据以及读取数据。我在一个封闭的商店工作,所以我不能发布它,但如果你有任何其他具体的问题,我很乐意帮助。

祝你好运。