TCPClient断开连接后如何重新连接

3
我有多个客户端应用实例,通过TcpClient连接到一个主应用程序。 (两者都是由我编写的)。所以,连接方式如下:
TcpClient.Connect(ip,port)
现在我想处理各种类型的断开连接事件:
1. 主应用程序 (服务器) 或客户端应用程序电脑失去互联网连接。 - 恢复连接后,通信似乎丢失,但当我尝试重新连接时,会收到消息: "A connection request was made on an already connected socket" 因此,我需要关闭并重新启动客户端应用程序。
2. 主应用程序(服务器)被关闭并重新启动。 - 重新启动主应用程序,然后尝试重新连接客户端应用程序,会导致与上述相同的错误。
所以,我需要做什么呢?每当出现这种中断时,我需要在客户端应用程序中实例化一个新的TcpClient吗?我还没有尝试过,因此不知道是否是一个不好的解决方案。

1
请查看我的解决方案:https://github.com/Mellen/Networking-Samples - Matt Ellen
3
不要看那个客户端示例。不要使用线程在后台读取。使用异步方法。 - jgauffin
2个回答

7

每当出现这种中断,我需要实例化一个新的TcpClient吗?

是的。如果TcpClient表示的连接已经断开,您不能再使用该对象进行进一步通信,也不能重新连接它。请创建一个新的TcpClient对象。

您遇到的问题可能是NAT网关超时了TCP连接,因此在服务器<->客户端之间无法传递任何内容,如果您的客户端只是从连接中读取数据,那么它将无法发现这种情况,并且认为连接仍然打开。


谢谢!我计划从客户端应用程序每5秒检查一次连接。不确定如何实现,是通过发送一个应该给出特定响应的标准消息,还是可能已经有TcpClient对象上可以使用的某种方法?然后这应该发现任何断开连接,然后我可以实例化一个新的TcpClient并重新连接。听起来合理吗? - bretddog
是的,在连接上发送某种心跳并等待(带有超时)回复。 - nos

1

我通常通过使用线程来解决这个问题。我创建了一个控制线程,循环执行管理任务,例如检查连接、检查最新的用户输入、检查服务器关闭请求等等。当它完成后,它会休眠半秒钟,然后再次执行。

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

调试是一场噩梦,但一旦修复了错误,它出奇地稳定。在一个实例中,它成功运行了一年以上,处理了成千上万个连接和数百个并发连接,而无需重新启动或任何维护。


谢谢,是的,我需要处理这个问题。我也需要这样的稳定性水平。目前,我在流读取上使用AsyncCallback,所以我想这将使它成为一个独立的线程。对于持续的检查,我使用定时器来触发事件,它运行在自己的线程上。但是我需要加入更全面的检查。 - bretddog
计时器线程和回调线程很好,但如果您编写自己的线程,则可能会有更好的控制。另一个优点是我能够将它们打包在自己的库中,客户端和服务器都可以使用,以便客户端可以运行自己的服务器进行调试。此外,我相信客户端和服务器都可以利用共同的例程。 - maple_shaft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接