Sockets 同一端口上有两个RMIRegistry.exe?
我正在使用Windows7(Professional,64位)系统,我已经看到了当前的情况,有人能给我介绍一下并解释一下这是怎么可能的吗?我已经安装了Java 6(仅限JRE)和Java 7(JDK),它们都是64位的Sockets 同一端口上有两个RMIRegistry.exe?,sockets,rmi,java-7,java-6,rmiregistry,Sockets,Rmi,Java 7,Java 6,Rmiregistry,我正在使用Windows7(Professional,64位)系统,我已经看到了当前的情况,有人能给我介绍一下并解释一下这是怎么可能的吗?我已经安装了Java 6(仅限JRE)和Java 7(JDK),它们都是64位的 在命令提示符下,我从jre6/bin目录运行rmiregistry.exe(默认端口1099)。当该命令正在运行时,我尝试从另一个命令提示符再次运行它。它返回一个异常,表示端口已绑定 同样,对于jdk7/bin目录中的rmiregistry.exe。相同的异常,已绑定 在命令提示
jre6/bin
目录运行rmiregistry.exe
(默认端口1099)。当该命令正在运行时,我尝试从另一个命令提示符再次运行它。它返回一个异常,表示端口已绑定jdk7/bin
目录中的rmiregistry.exe
。相同的异常,已绑定jre6/bin
目录运行rmiregistry.exe
(默认端口1099)。当该端口正在运行时,我尝试从另一个命令提示符从jdk7/bin
目录运行rmiregistry.exe
(默认端口1099)。
它跑了!查看和netstat-a-b-o
结果,两个PID都在侦听IPv4和IPv6上的端口1009。第一个要运行的是对RMI操作和API的回复详情如下:
- 运行Java 6 RMI注册表时,异常堆栈跟踪返回到由以下原因引起的
,来自:Java.net.BindException:地址已在使用:JVM_Bind
李>Java.net.PlainSocketImpl.socketBind(本机方法)
- 相反,运行Java7RMI注册表时,异常stacktrace来自
Java.net.DualStackPlainSocketImpl.bind0(本机方法)
-Djava.net.preferIPv4Stack=true
VM选项有关吗?我如何从Java 7知道IPv4和IPv6 RMI端口是否已被Java 6或Java 7 RMI注册表中的任何一个占用
再一次,更多细节
- 我已经停止了一切。只是为了好玩,我在端口1099上运行了Calibre(电子书管理应用程序)内部web服务器
- 来自Java 6的
,它告诉我它无法运行,因为端口正忙rmiregistry.exe
从Java 7运行。。。但是,与以前一样,1099端口上的回复来自Calibrermiregistry.exe
还有一点:在Ubuntu(使用OpenJDK)上运行相同的两个RMI注册中心(Java 6+Java 7,32位),我通过
Java.net.PlainSocketImpl.socketBind(本机方法)
(即使对于Java 7!)获得了“端口已在使用”消息。没有两个东西可以占用同一个端口。。。像往常一样!所以,至少,我知道这是Windows7+Java的问题
还有什么提示吗
我在DatagramSocket中看到了类似的情况:我在Java 6的一个端口上使用它,然后我用Java 7运行另一个相同的应用程序,它连接到该端口(但不工作),即使它已经被使用。然后,使用Java7启动第三个相同的应用程序,这个应用程序会意识到这样的端口已经很忙了。我认为这可能与RMI注册表相同
为什么我可以在同一个端口上运行两个RMI注册表?为什么Java6和Java7在某些方面对套接字和端口有“冲突”行为?另外,为什么Windows(7,在我的情况下)不阻止同一端口上的第二个请求?您如何知道哪一个正在响应绑定和查找?因为当我终止第二个(通过任务管理器)时,一切都继续工作,而如果我终止第一个,一切都停止。“其他一切”是否包括新的绑定和查找?因为正常的RMI通信根本不通过注册表。实际上,我的应用程序监视绑定到注册表的资源列表:当注册表为空或显然不可用时,它会关闭。这就是为什么我理解了哪个rmiregistry.exe实际上涉及其中。天哪。。。没有人能回答我?