我的问题与jbu's bind errors in Java非常相似。
不同之处在于我的服务器打开一个流来接受整天的连接,然后我有一个脚本在早上硬杀服务,等待10秒,然后重启服务以接受连接。大多数情况下,它可以工作,但有时,在尝试启动时,服务将遭受BindExceptions。在外部脚本被硬件杀死之前,我想不出一个很好的方法来关闭程序中的流,所以我想知道什么是在外部释放端口锁的好方法,或者如果我应重新设计设计,以便服务自行终止,但确保在执行此操作之前关闭所有连接。 (我在机器上运行Windows Server 2008。)
答案 0 :(得分:1)
当TCP连接关闭时,连接可能会在连接关闭后的一段时间内保持超时状态(通常称为TIME_WAIT状态或2MSL等待状态)。对于使用众所周知的套接字地址或端口的应用程序,如果在涉及套接字地址或端口的超时状态中存在连接,则可能无法将套接字绑定到所需的SocketAddress。
这就是为什么你注意到即使你等了10秒钟,服务也会受到BindExceptions的影响。
在使用bind(SocketAddress)绑定套接字之前启用SO_REUSEADDR允许套接字绑定,即使先前的连接处于超时状态。 这可以通过以下方式实现:
绑定套接字之前 ServerSocket.setReuseAddress(true)。
这会强制执行或传达操作系统以重用相同的地址,即使它已经显示为绑定...