我在我的一个Java应用程序中使用Socket通信。我知道如果程序遇到任何异常终止,监听端口不会关闭,程序无法启动,因为它报告“端口已经打开...” 无论如何我还能处理这个问题吗?用于处理此事的一般方法是什么?
答案 0 :(得分:22)
听起来你的程序正在侦听套接字。通常,当程序退出操作系统时,会关闭所有可能打开的套接字(包括监听套接字)。但是,对于侦听套接字,操作系统通常在程序退出后保留端口一段时间(几分钟),以便它可以处理任何未完成的连接尝试。您可能会注意到,如果您异常关闭程序,那么稍后再回来它会启动就好了。
如果要避免此延迟时间,可以使用setsockopt()
使用SO_REUSEADDR选项配置套接字。这告诉操作系统您知道重用相同的地址是可以的,并且您不会遇到这个问题。
您可以使用ServerSocket.setReuseAddress(true)
方法在Java中设置此选项。
答案 1 :(得分:4)
您想在套接字上设置SO_REUSEADDR标志
请参阅http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html#setReuseAddress(boolean)
答案 2 :(得分:2)
当JVM进程结束时,操作系统应自动处理诸如此类的事情。但是,在端口关闭之前可能会有短暂的延迟。
答案 3 :(得分:2)
正如Handling abnormal Java program exits中所述,您可以设置 Runtime.addShutdownHook() 方法来处理任何特殊情况,如果它确实需要显式操作。