2

我正在尝试编写一个 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;
  }
}
4

1 回答 1

0

TcpClient 上有一个 Connected 属性,但它仅在 NetworkStream 上执行写入或读取时更新。

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

至于重新建立链接,您将拥有什么。我建议在获得新的网络流之前处理旧的网络流。像这样的东西:

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

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

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

祝你好运。

于 2013-05-30T15:24:33.380 回答