java rmi -Djava.rmi.server.hostname = localhost仍会打开一个监听0.0.0.0的套接字

时间:2012-04-16 12:11:35

标签: java rmi

我使用 -Djava.rmi.server.hostname = localhost 选项仅在localhost上进行rmi侦听,但netstat显示套接字正在侦听 0.0.0.0

奇怪的是RMI RenewClean线程显示它使用localhost。例如。 RMI RenewClean- [localhost:59357]

我认为如果我设置 -Djava.rmi.server.hostname = localhost ,它应该只是在监听127.0.0.1

我误解了java.rmi.server.hostname控制的内容吗?

3 个答案:

答案 0 :(得分:17)

  

我假设如果我设置-Djava.rmi.server.hostname = localhost它应该   只听127.0.0.1

没有

  

我误解了java.rmi.server.hostname控制的内容吗?

是。 java.rmi.server.hostname与远程对象侦听的IP地址无关。这由RMIServerSocketFactory.

决定

在另一个答案(随后删除)中纠正我的书中的错误引用:

  

java.rmi.server.hostname:主机名字符串;默认值是本地主机的“dotted-quad”格式的IP地址...当导出远程对象时,它嵌入到由此JVM创建的远程存根中。这可用于控制多宿主主机导出的RMI服务器的有效IP地址。此属性在JVM的生命周期中只读取一次。[1]

为了扩展它,它还可以用于控制NAT设备后面的主机导出的RMI服务器的有效IP地址(由客户端看到)。它不一定与本地主机有任何关系,例如:在NAT情况下,它可以是主机名,点分四IPv4地址或IPv6地址。

[1] Pitt& McNiff, java.rmi,远程方法调用指南, Addison Wesley 2001,第258页。

答案 1 :(得分:0)

我自己遇到了这个问题,我想提供一个不同的上下文来向那些熟悉HTTP工作原理的人解释这个价值。最初连接到com.sun.management.jmxremote.port指定的端口时,响应与HTTP重定向到由以下内容形成的名称的效果相同:java.rmi.server.hostname:com.sun.management.jmxremote .rmi.port。这意味着主机名必须是:a)JMX客户端可解析的,和b)允许通过路由和防火墙连接的主机名。该端口也可以与提供重定向的初始端口重叠。

现在,问题是:您可以阻止重定向吗?据我所知,不可以。我尝试将主机名设置为各种值,例如0.0.0.0、255.255.255.255,''(空)。我也将端口设置为“ 0”,以查看这是否会影响行为。不。尽管您可以将同一端口连接到协议的查找和RMI部分,但是它并不能让您仅建立到相同解析IP的连接。

我认为这种行为是为了允许一个进程充当多个进程或群集中许多节点的RMI端口的中央索引,但是对于NAT,这只是协议设计中令人烦恼的遗物。

答案 2 :(得分:0)

由于Java 8u102 -Dcom.sun.management.jmxremote.host绑定到特殊IP地址。