Java RMI -Djava.rmi.server.hostname=localhost 仍然会在0.0.0.0上打开一个监听套接字。

12
我使用-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的控制作用?

1
0.0.0.0也是回环地址。也许是因为它们非常相似而导致混淆。(我不知道它们之间的区别)你尝试过使用“-Djava.rmi.server.hostname=127.0.0.1”吗? - Peter Lawrey
1
@PeterLawrey 不是的。请看我的回答。 - user207421
3个回答

23
我原以为如果我设置-Djava.rmi.server.hostname=localhost,它只会监听127.0.0.1。

不是的。 java.rmi.server.hostname与远程对象侦听的IP地址毫无关系。这由RMIServerSocketFactory确定。 要更正我在另一个答案中的错误引用(随后已删除): java.rmi.server.hostname:主机名字符串;默认值是本地主机的IP地址,格式为“点分十进制”...被嵌入到由此JVM创建的远程存根中,当远程对象被导出时。这可以用于控制由多主机主机导出的RMI服务器的有效IP地址。该属性在JVM的生命周期中仅读取一次。 此外,它还可以用于控制被NAT设备隐藏的主机导出的RMI服务器的有效IP地址(客户端看到的)。它不一定与本地主机有关,在NAT情况下,它可以是主机名、点分十进制IPv4地址或IPv6地址。

说实话,我不太明白它如何影响配置在https://dev59.com/p2Up5IYBdhLWcg3wvZRV#32418821-没有这行代码,它就无法正常工作。 - Boris Treukhov
@BorisTreukhov 我已经回答了。它影响存根中的内容,而不是它监听的IP地址。 - user207421
@Ser 非因果关系。该属性不控制服务器侦听的IP地址。删除它可能确实会影响连接,但不是因为它改变了绑定地址。 - user207421
@isapir 是的。我已经在五年前回答过这个问题了。 - user207421
@EdwinSamuelJonathan 没有,但这又是一个“非正常推论”。它不会影响绑定地址,绑定地址由套接字工厂控制。这在2012年就已经说明了,比你的评论早七年。 - user207421

1

自从Java 8u102版本开始,-Dcom.sun.management.jmxremote.host绑定到特殊的IP地址。


Java RMI仍将绑定到0.0.0.0。 - nathou
仅适用于JMX服务器。 - user207421

-1

我自己遇到了这个问题,想提供一个不同的上下文来解释这个值是什么,让那些熟悉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下,它只是协议设计早期的一种令人烦恼的遗留问题。

这与HTTP完全没有任何关系。 - user207421
这与HTTP毫无关系。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接