中断后重新连接TCPClient

时间:2011-05-06 11:13:03

标签: c# .net sockets tcp tcpclient

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

TcpClient.Connect(ip,port)

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

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

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

    • 重新启动主应用程序,然后尝试重新连接客户端应用程序,会导致与上述相同的错误。
  3. 那么,我需要做什么?每当发生此类中断时,是否需要在客户端应用程序中实例化新的TcpClient?我没有尝试过,所以不知道这是不是一个糟糕的解决方案?

2 个答案:

答案 0 :(得分:6)

  

在发生此类中断时,是否需要在客户端应用中实例化新的TcpClient?

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

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

答案 1 :(得分:1)

我通常在使用线程之前解决了这个问题。我创建了一个循环的控制线程,并执行管理操作,检查连接,检查最新的用户输入,检查服务器关闭请求等。完成后,它会睡半个小时并重新执行。< / p>

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

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