知道为什么我在尝试从 Windows 调用 Unix 机器上的方法时得到 RemoteException 吗?
我在网络内部,不认为这是因为防火墙问题,因为在 unix 机器上启动 RMI 服务器后,我可以从 Windows 到 Unix 机器进行“远程登录”。我也不明白为什么要转到本地环回IP?
堆栈跟踪:
RemoteException occured, details java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
java.net.ConnectException: Connection refused: connect
java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
java.net.ConnectException: Connection refused: connect
非常感谢。
最佳答案
您的 Linux 机器上可能没有正确配置主机名。我敢打赌,如果你从你的 Linux 机器上 ping $(hostname)
,它会 ping 127.0.0.1
。通常这是因为您的 /etc/hosts
文件中有一个条目。
有几种方法可以解决这个问题。困难的方法是让你的 Linux 机器正确地将它自己的主机名解析为它的 IP 地址。您可以编辑您的 /etc/hosts
文件,设置您的 DNS 服务器,无论您需要做什么。挑战在于,虽然这可能使事情在技术上更正确,但您冒着破坏依赖于旧行为的事情的风险。
变化最少的路径是 set the system property java.rmi.server.hostname
到您的 Linux 机器的主机名或 IP 地址。 (即 java -Djava.rmi.server.hostname=$(hostname) ...
)。
为什么?
Java RMI 注册服务器实际上是一个网络范围的注册服务器。其他机器上的对象可以将自己绑定(bind)到这个注册表。
注册远程对象时,注册包括网络地址作为注册的一部分。默认情况下,它使用的地址是“本地主机的 IP 地址,采用“点分四组”格式。”在您的设置中,此地址为 127.0.0.1
。
当您的 Windows 机器联系远程对象地址的注册服务时,它会返回 127.0.0.1
。然后它会尝试联系位于该地址的远程对象。这就是它转到环回地址的原因。
关于java - RMI 远程异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2748259/