2013-02-28 86 views
0

我有一个问题非常类似于jbu's bind errors in JavaJava服务器不释放连接锁

不同之处在于我的服务器打开一个流接受整天连接,然后我有一个脚本在早上硬杀服务,等待10秒,然后重新启动服务以接受连接。大多数情况下,它都可以工作,但有时候,服务尝试启动时会遇到BindExceptions。我想不出在程序被外部脚本强行杀死之前关闭流的好方法,所以我想知道什么是释放端口上的锁的好方法,无论是外部的,还是我应该对设计进行重新设计,以便服务自行消失,但确保所有连接都在关闭之前关闭。 (我在机器上运行Windows Server 2008)

+1

您的意思是,虽然重新启动服务器'BindExceptions'错误显示? – 2013-02-28 16:38:07

+0

是的,确切!我无法重新启动服务器,因为它无法绑定到端口,对此感到抱歉。 – Sal 2013-02-28 16:39:20

回答

1

当TCP连接关闭时,连接关闭后连接可能会保持超时状态一段时间(通常称为TIME_WAIT状态或2MSL等待状态)。对于使用众所周知的套接字地址或端口的应用程序,如果在涉及套接字地址或端口的超时状态中存在连接,则可能无法将套接字绑定到所需的套接字地址。
这就是为什么你注意到有时服务会遭受BindExceptions,即使你等待10秒。

使用bind(SocketAddress)绑定套接字之前启用SO_REUSEADDR允许套接字被绑定,即使先前的连接处于超时状态。 这可以使用:

ServerSocket.setReuseAddress(true)在绑定套接字之前。
这强制或传达的操作系统重用相同的地址,即使它已经显示为绑定...