我使用以下方法创建了一个 ServerSocket:
InetSocketAddress inetsktaddr = new InetSocketAddress(0);
ServerSocket sckt = new ServerSocket();
sckt.bind(inetsktaddr);
Socket socket = sckt.accept();
当应用程序运行时,使用我发现的 netstat,
TCP 0.0.0.0:49906 0.0.0.0:0 LISTENING 9196
TCP [::]:49906 [::]:0 LISTENING 9196
有时当应用程序崩溃时,netstat 结果显示:
TCP [::]:49906 [::]:0 LISTENING 9196
当搜索进程ID 9196时,没有这样的进程存在。这是应用程序运行时的java.exe进程ID。出现这种情况的原因是什么?
我使用的是 java 1.5 和 Windows 7 Professional
编辑
过了一段时间我发现了以下内容: 我的应用程序启动 mysql 数据库。有时java.exe崩溃时,mysql不会崩溃。数据库服务器将仅启动。当这个问题出现时(::单独处于监听状态),我杀死了mysql进程,::socket立即停止监听。所以mysql以某种方式阻止::在java崩溃时消失。找不到原因。
最佳答案
终于找到原因了,是JVM的Bug。 (http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6598160)
子进程将仅继承 IPV6 套接字句柄,而不继承 IPV4 套接字句柄。因此这个问题就出现在我身上。
修复的是我应该升级 JVM 或仅在 ipv4 服务器套接字中监听。
关于java - 即使应用程序崩溃后,IPV6 ServerSocket 仍在监听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26888395/