如果程序终止,如何关闭端口?

时间:2009-04-20 07:50:18

标签: java multithreading sockets jvm

我在我的一个Java应用程序中使用Socket通信。我知道如果程序遇到任何异常终止,监听端口不会关闭,程序无法启动,因为它报告“端口已经打开...” 无论如何我还能处理这个问题吗?用于处理此事的一般方法是什么?

4 个答案:

答案 0 :(得分:22)

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

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

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

答案 1 :(得分:4)

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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