【问题标题】:How do I close a port in a case of program termination?在程序终止的情况下如何关闭端口?
【发布时间】:2009-04-20 07:50:17
【问题描述】:

我在我的一个 Java 应用程序中使用 Socket 通信。据我所知,如果程序遇到任何异常终止,侦听端口不会关闭并且程序无法重新启动,因为它报告“端口已打开..” 我有没有办法处理这个问题?处理这个问题的一般方法是什么?

【问题讨论】:

    标签: java multithreading sockets jvm


    【解决方案1】:

    听起来您的程序正在侦听套接字。通常,当您的程序退出时,操作系统会关闭所有可能打开的套接字(包括侦听套接字)。但是,对于侦听套接字,操作系统通常会在程序退出后保留端口一段时间(几分钟),以便它可以处理任何未完成的连接尝试。您可能会注意到,如果您的程序异常关闭,过一段时间再回来,它会正常启动。

    如果你想避免这个延迟时间,你可以使用setsockopt() 来配置带有 SO_REUSEADDR 选项的套接字。这告诉操作系统你知道重复使用相同的地址是可以的,你不会遇到这个问题。

    您可以在 Java 中使用ServerSocket.setReuseAddress(true) 方法设置此选项。

    【讨论】:

      【解决方案2】:

      您想在套接字上设置 SO_REUSEADDR 标志。

      setReuseAddress()

      【讨论】:

        【解决方案3】:

        当 JVM 进程结束时,操作系统应该自动处理诸如此类的事情。不过,在关闭端口之前可能会有短暂的延迟。

        【讨论】:

          【解决方案4】:

          Handling abnormal Java program exits 中所述,如果确实需要显式操作,您可以设置一个Runtime.addShutdownHook() 方法来处理任何特殊情况。

          【讨论】:

            猜你喜欢
            • 2022-01-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-22
            • 1970-01-01
            • 2012-08-21
            相关资源
            最近更新 更多