java - 即使应用程序崩溃后,IPV6 ServerSocket 仍在监听

标签 java sockets ipv6 serversocket netstat

我使用以下方法创建了一个 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/

相关文章:

java - 如何测试 Spring Batch 应用程序的整个流程?

java - 时区在 Windows 服务器中无法正常工作

c# - 读取 NetworkStream = 100% CPU 使用率

java - 如何解析Netty(java)中的各种对象?

python - 为什么这段python代码在linux下可以运行,而在windows下却不行呢?

python - 在使用 Python HTTP Server 和 CGI​​ 托管的网站上收集用户的 IPv6 或 MAC 地址

java - Java 源文件末尾的空新行

c - 在服务器代码中收到来自 8080 的请求后,为客户端分配一个新的套接字

python - 如何使用 ipv6 https 代理连接到网站

java - 未使用该字段的值