11

我使用-Djava.rmi.server.hostname=localhost选项使 rmi 仅在 localhost 上侦听,但 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 控制的内容?

4

3 回答 3

21

我假设如果我设置 -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,p.258。

于 2012-04-16T12:31:30.897 回答
2

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

于 2020-08-20T10:47:44.967 回答
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,它只是协议设计中过去几天令人恼火的遗留物。

于 2020-07-18T18:18:34.840 回答