我假设如果我设置 -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。