即使重用地址设置为 true,什么会导致 TCP 套接字抛出“java.net.BindException:地址已在使用中”?仅当应用程序快速重新启动时才会发生这种情况。在 CentOS 5 linux 操作系统上运行。
3 回答
这有点解释它:
http://www.beej.us/guide/bgnet/output/html/singlepage/bgnet.html#bind
有时,您可能会注意到,您尝试重新运行服务器并且 bind() 失败,并声称“地址已在使用中”。这意味着什么?好吧,一个已连接的套接字仍然在内核中徘徊,它占用了端口。您可以等待它清除(一分钟左右),或者向您的程序添加代码允许它重用端口,就像这样
(提供 C 代码)
基本上,在 C 中,您调用一个名为 setsockopt() 的函数,其中一个参数称为 SO_REUSEADDR,它允许您重用该端口。
我在 google 上找到了一些简短的链接,这些链接应该让您开始了解如何在 Java 中设置等效选项:
http://java.sun.com/j2se/1.4.2/docs/guide/net/socketOpt.html
http://java.sun.com/j2se/1.4.2/docs/api/java/net/SocketOptions.html
如果您说的是正确的,您应该能够在循环中捕获此异常并在几秒钟后重试。(你不应该这样做,但我听说过关于 CentOS 的一些奇怪的事情)
如果您的端口或 InetAddress 中的任何一个已被使用并且您想再次使用,则会发生 Java 绑定异常。因此,如果正在运行,请释放端口停止程序。否则更改端口
谢谢迪帕克