【问题标题】:Reconnect a Java socket connection on disconnect断开连接时重新连接 Java 套接字连接
【发布时间】:2012-06-02 16:43:19
【问题描述】:

我有 Java 代码,它与家庭自动化设备建立长期的套接字连接,以监控它的活动/事件。问题是如果设备重新启动或重新启动,Java 代码应尽快自动重新连接。关于如何在 Java 端检测断开连接的任何想法,最好不要定期轮询设备?

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    如果设备在没有正确关闭套接字的情况下重新启动,我不知道有什么可以让您检测到它。在这种情况下,您的服务器将无法检测到套接字已消失,除非设备恢复正常,或者直到您服务器上的 TCP/IP 堆栈放弃并声明连接已失效。在某些时候你会得到一个IOException. 你需要捕获那个异常,然后在它发生时重新连接。

    您真的受制于 TCP/IP 的行为。当连接的一端简单地消失(没有FIN 数据包)时,另一端可能会等待任意长度的时间(取决于许多因素),然后才能确定连接已死。

    如果您想早点发现这个问题——并且您可以保证设备会在设定的时间内做出响应,那么请在套接字上设置一个超时时间。如果您这样做,如果设备没有响应,您将收到SocketTimeoutException,然后您可以关闭套接字并尝试重新打开套接字。我已经成功地使用了它。

    【讨论】:

      【解决方案2】:

      如果您的软件只是在等待来自家庭自动化设备的数据,那么检测设备已丢失的唯一方法是在打开的套接字中启用 SO_KEEPALIVE 选项以与设备通信。

      为此,只需在套接字上调用 setKeepAlive(true) 方法,这将使底层套接字实现启用 SO_KEEP_ALIVE 选项。

      这将使底层实现定期与远程端点交换一些数据,如果在您等待数据时设备死机,则会抛出异常。

      唯一的问题是,这个保持活动超时取决于操作系统,有时无法更改。

      如果您需要更短的超时时间,除了在设备上实施定期探测之外别无他法。

      【讨论】:

        【解决方案3】:

        我已经解决了同样的问题。

        如果您想早点发现这个问题——并且您可以保证设备会在设定的时间内做出响应,那么请在套接字上设置一个超时时间。如果您这样做,如果设备没有响应,您将收到 SocketTimeoutException,然后您可以关闭套接字并尝试重新打开套接字。我已经成功地使用了它。

        以上引用:

        我让它关闭套接字然后尝试重新打开它,它运行 那个代码很好。唯一的问题是,一旦我关闭了一个套接字,我 无法重新打开它,我得到套接字已关闭的异常。这个 每次都会发生。如何关闭套接字然后重新打开它 遇到此异常?

        【讨论】:

          猜你喜欢
          • 2021-12-09
          • 2019-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-06
          • 2011-01-01
          • 1970-01-01
          • 2010-10-29
          相关资源
          最近更新 更多