两个RMIRegistry.exe在同一个端口上?

时间:2013-01-07 16:49:45

标签: sockets rmi java-7 java-6 rmiregistry

我正在研究Windows 7(专业版,64位)系统,我已经看到了目前的情况,有人可以突出我并解释可能性如何?我已经安装了Java 6(仅限JRE)和Java 7(JDK),均为64位。

  1. 在命令提示符下,我从rmiregistry.exe目录运行jre6/bin(默认端口1099)。当一个正在运行时,从另一个命令提示符我尝试再次运行它。它给了我一个例外,说端口已经绑定了。

  2. rmiregistry.exe目录中的jdk7/bin相同。同样的例外,已经绑定。

  3. 在命令提示符下,我从rmiregistry.exe目录运行jre6/bin(默认端口1099)。当一个正在运行时,从另一个命令提示符我尝试从rmiregistry.exe目录运行jdk7/bin(默认端口1099)。 它运行!在查看和netstat -a -b -o结果时,两个PID都在IPv4和IPv6上侦听端口1009。第一个要运行的,回复RMI操作和API。

  4. 怎么可能?两个RMIRegistry如何在端口1099上侦听?我错过了什么吗?

    感谢您的帮助。


    更多细节:

    • 运行Java 6 RMI注册表,异常堆栈跟踪从Caused by: java.net.BindException: Address already in use: JVM_Bind返回java.net.PlainSocketImpl.socketBind(Native Method);
    • 运行Java 7 RMI注册表,异常堆栈跟踪来自java.net.DualStackPlainSocketImpl.bind0(Native Method)

    有意义吗?这与-Djava.net.preferIPv4Stack=true VM选项有关吗?我如何从Java 7中了解IPv4和IPv6 RMI端口是否已被Java 6或Java 7 RMI Registry中的任何一个占用?


    再次,更多细节...

    • 我已经阻止了一切。只是“为了好玩”我在1099端口运行了Caliber(电子书管理应用程序)内部Web服务器;

    • 来自Java 6的
    • rmiregistry.exe它告诉我它无法运行,因为端口正忙;

    • 来自Java 7的
    • rmiregistry.exe运行...但是,和以前一样,端口1099上的回复来自Caliber。


    还有一个:在Ubuntu上运行相同的RMI注册表(Java 6 + Java 7,32位)(使用OpenJDK),我通过java.net.PlainSocketImpl.socketBind(Native Method)获得了“端口已在使用中的消息”(即使对于Java 7!)。没有两件事可以像往常一样占据同一个港口!所以,至少,我知道这是一个Windows 7 + Java问题!

    还有其他暗示吗?


    我在使用DatagramSocket时看到类似的东西:我在Java 6的端口上使用它,然后我用Java 7运行另一个相同的应用程序,它连接到该端口(但不起作用),即使它已被占用。然后,使用Java 7启动第三个相同的应用程序,这个应用程序意识到这样的端口已经很忙。我认为这可能与RMI Registry相同。

    为什么我可以在同一个端口上运行两个RMI注册表?为什么Java 6和Java 7在某些方面与套接字和端口有“冲突”的行为?另外,为什么Windows(7,在我的情况下)不会阻止同一端口上的第二个请求?

0 个答案:

没有答案