0

我有一个与jbu 在 Java 中的绑定错误非常相似的问题。

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

4

1 回答 1

1

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

在使用 bind(SocketAddress) 绑定套接字之前启用 SO_REUSEADDR 允许绑定套接字,即使先前的连接处于超时状态。这可以通过以下方式实现:

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

于 2013-02-28T16:48:01.790 回答