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

标签 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;
  }
}

最佳答案

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-1000 毫秒的小间隔开始尝试,并且增量是在给定次数的失败重试之后,这样您就不会浪费大量时间尝试连接到已经消失的主机。然后在达到最大尝试次数后放弃,除非用户明确要求重试。但这也取决于您的应用程序还在做什么,连接是它的唯一目的还是它只是一个部分。

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

祝你好运。

关于c# - 如何在 C# 中创建可以从丢失的网络连接中恢复的 TcpClient?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16826794/

相关文章:

c# - 编译查询错误 : there is no implicit conversion from entities to 'System. Data.Objects.ObjectContext

c# - 如何在 C# 中修复 SQLite 查询?

c# - 使用套接字响应客户端?

java - 我的应用程序卡在 mBufferIn.readLine() 上

c# - 使用C#访问系统目录

c# - 我有一个现有的 asp.net mvc 站点(在 iis 7 上),我可以在 a/blog 子目录中添加 wordpress 吗?

c# - 捕获 python 程序的标准输出

c# - 从套接字读取时

c# - 客户端没有及时收到消息(TcpClient)

c# - 无法通过 TCP/IP 发送第二条消息