代码之家  ›  专栏  ›  技术社区  ›  Chathuranga Chandrasekara

在程序终止的情况下,如何关闭端口?

  •  8
  • Chathuranga Chandrasekara  · 技术社区  · 16 年前

    我在我的一个Java应用程序中使用套接字通信。我知道如果程序遇到任何异常终止,监听端口不会被关闭,程序不能返回,因为它报告“端口已经打开…”。 我必须处理这个问题吗?处理这件事的一般方法是什么?

    4 回复  |  直到 14 年前
        1
  •  22
  •   Greg Hewgill    16 年前

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

    如果要避免这种延迟时间,可以使用 setsockopt() 使用sou reuseaddr选项配置套接字。这告诉操作系统,您知道重用同一个地址是可以的,并且不会遇到这个问题。

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

        2
  •  4
  •   James Davies    16 年前
        3
  •  2
  •   Esko Luontola    16 年前

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

        4
  •  2
  •   Community CDub    8 年前

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