【问题标题】:Java Server Not Releasing Connection LockJava 服务器未释放连接锁
【发布时间】:2013-02-28 16:26:44
【问题描述】:

我有一个与jbu's bind errors in Java 非常相似的问题。

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

【问题讨论】:

  • 您的意思是在重新启动服务器时出现BindExceptions 错误??
  • 是的,完全正确!我无法重新启动服务器,因为它无法绑定到端口,很抱歉造成混乱。

标签: java sockets windows-server-2008 bind


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 2022-11-13
    • 1970-01-01
    • 2014-08-06
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多