2

我正在使用 Windows 7(专业版,64 位)系统,并且我已经看到了当前的情况,有人可以突出显示我并解释一下怎么可能吗?我已经安装了 Java 6(仅限 JRE)和 Java 7(JDK),都是 64 位的。

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

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

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

这怎么可能?两个 RMIRegistry 怎么能监听 1099 端口?我错过了什么吗?

谢谢你的帮助。


更多细节:

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

有什么意义吗?这与-Djava.net.preferIPv4Stack=trueVM选项有关吗?从 Java 7 开始,我如何知道 IPv4 和 IPv6 RMI 端口是否已被 Java 6 或 Java 7 RMI Registry 占用?


再次,更多细节......

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

  • rmiregistry.exe从 Java 6 开始,它告诉我它无法运行,因为端口很忙;

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


还有一个:在 Ubuntu(使用 OpenJDK)上运行相同的 RMI 注册表(Java 6 + Java 7,32 位),我通过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)不会阻止同一端口上的第二个请求?

4

0 回答 0