【问题标题】:Reconnect TCPClient after interruption中断后重新连接 TCPClient
【发布时间】:2011-08-20 02:45:05
【问题描述】:

我有多个客户端应用程序实例,通过 TcpClient 通过 Internet 连接到主应用程序。 (都由我编码)。所以连接是这样的:

TcpClient.Connect(ip, 端口)

我现在希望它处理各种类型的断开连接事件:

  1. 主应用程序(服务器)或客户端应用程序计算机失去互联网连接。

    • 在恢复连接时,通信似乎丢失了,但是当我尝试重新连接时,我收到消息: “在已连接的套接字上发出了连接请求”
    • 所以我需要关闭并重新启动客户端应用程序。
  2. 主应用程序(服务器)已关闭,然后重新启动。

    • 重新启动主应用程序,然后尝试重新连接客户端应用程序,导致与上述相同的错误。

那么,我需要做什么?每当发生此类中断时,我是否需要在客户端应用程序中实例化一个 New TcpClient?没试过,不知道是不是不好解决?

【问题讨论】:

标签: c# .net sockets tcp tcpclient


【解决方案1】:

每当发生此类中断时,我是否需要在客户端应用程序中实例化一个 New TcpClient?

是的。如果 TcpClient 代表的连接断开,则不能使用该对象进行进一步通信,也不能再次连接。创建一个新的 TcpClient 对象。

您的问题很可能是 NAT 网关超时了您的 TCP 连接,因此您的服务器客户端之间没有任何东西可以通过,如果您的客户端所做的所有操作都是从连接中读取的,它不会发现这种情况,并且它认为连接仍然打开。

【讨论】:

  • 谢谢!我计划每 5 秒左右检查一次客户端应用程序的连接。不知道如何通过发送一个应该给出特定响应的标准消息,或者我可以使用 TcpClient 对象上已经有一些方法?然后这应该会发现任何断开连接,然后我可以实例化一个新的 TcpClient 并重新连接。这听起来合理吗?
  • 是的。在连接上发送某种心跳并等待(超时)回复
【解决方案2】:

过去我通常通过使用线程来解决这个问题。我创建了一个控制线程,它循环并执行管理操作,例如检查连接、检查最新的用户输入、检查服务器关闭请求等。完成后,它睡了半秒钟,然后重新开始。

然后,我创建了一个单独的 Socket 线程,并简单地维护了一个网络套接字。一旦启动,它就会打开连接,并反复循环寻找来自它所连接的任何人的传入消息。如果它找到一条消息,它将处理它并将其存储在一个易失性对象集合中以供控制线程使用。如果连接发生问题,它将自动尝试解决,如果无法解决,它将进入“死”状态。控制线程在其下一次迭代中将清理死套接字线程并根据需要创建新的。

调试是一场噩梦,但一旦解决了错误,它就会出奇地稳定。在一个实例上,它成功运行了一年多,拥有数万个连接和数百个并发连接,无需重新启动或任何维护。

【讨论】:

  • 干杯,我需要解决这个问题。我也需要这样的稳定​​性。目前我在读取的流上使用 AsyncCallback,所以我想这将使它自己独立的线程。对于连续检查,我使用计时器来触发事件,该事件在它自己的线程上运行。但我需要进行更全面的检查。
  • 定时器线程和回调线程都很好,但是如果您编写自己的线程可能会有更好的控制。这样做的另一个优点是我能够将它们打包到客户端和服务器都拥有的自己的库中,以便客户端可以运行自己的服务器以进行调试。另外,我确信客户端和服务器都可以使用一些通用例程。
猜你喜欢
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2019-02-22
相关资源
最近更新 更多