中断后重新连接TCPClient

问题描述:

我有一个客户端应用程序的多个实例,通过TcpClient通过互联网连接到一个主应用程序。 (都由我编码)。因此,在建立连接,如:中断后重新连接TCPClient

TcpClient.Connect(IP,端口)

我现在想这个处理各种类型断开事件:

  1. 主要的应用程序(服务器)或客户端应用程序电脑失去互联网连接

    • 在连接时的简历,通讯似乎失去了,但是当我尝试重新连接时,我得到消息:
    • 所以我需要关闭“的连接请求已连接的套接字上做了”并重新启动客户端应用。
  2. 主应用程序(服务器)关闭并重新启动。

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

那么,我需要做什么?我是否需要在客户端应用程序中实例化新的TcpClient,只要发生这种中断?我还没有尝试过,所以不知道这是否是一个糟糕的解决方案?

+1

看看我的解决方案:https://github.com/Mellen/Networking-Samples – 2011-05-06 11:17:06

+3

不,不要看那个客户端的例子。不要使用线程在后台读取。使用异步方法。 – jgauffin 2011-05-06 11:32:05

我是否需要在客户端应用程序中实例化一个新的TcpClient,只要发生这种中断?

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

你的问题很可能是NAT网关超时你的TCP连接,所以没有任何东西可以通过你的服务器< - >客户端,如果你的客户端所做的是从连接中读取,它不会发现这种情况,并且它认为连接仍然是开放的。

+0

谢谢!我打算每隔5秒左右检查客户端应用程序的连接。不知道如何,通过发送一个标准的消息,应该给出一定的响应,或者可能有一些方法已经在我可以使用的TcpClient对象上?然后这应该发现任何断开连接,然后我可以实例化一个新的TcpClient并重新连接。这听起来合理吗? – bretddog 2011-05-06 11:50:02

+0

是的。在连接上发送某种心跳,然后等待(超时)以进行回复 – nos 2011-05-06 13:32:39

我以前通常使用线程解决了这个问题。我创建了一个控制线程,循环执行管理事务,检查连接,检查最新的用户输入,检查服务器关闭请求等。完成后,它休眠半秒钟,然后重新完成。

然后,我创建了一个单独的套接字线程,并且简单地维护了一个网络套接字。它会打开连接,一旦启动并循环反复查找来自谁连接到的任何传入消息。如果它发现一条消息,它会处理它并将其存储在易失性对象集合*控制线程使用。如果连接发生了什么事情,它会自动尝试解决,如果不能,它会进入“死亡”状态。下一次迭代的控制线程将清理死亡套接字线程并根据需要创建新线程。

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

+0

干杯,我需要在这个工作是的。我也需要这样的稳定​​性。目前我在流读取上使用AsyncCallback,所以我想这会使它独立于它自己的线程。对于连续检查,我使用一个计时器来触发事件,这个事件在它自己的线程上运行。但我需要纳入更全面的检查。 – bretddog 2011-05-06 12:18:31

+0

定时器线程和回调线程很好,但是如果你编写自己的线程,你可能会有更好的控制。这样做的另一个好处是,我可以将它们打包到客户端和服务器都有的自己的库中,以便客户端可以运行自己的服务器用于调试目的。另外,我确信客户端和服务器都可以使用常见的例程。 – 2011-05-06 12:39:34