java - RMI 远程异常

标签 java rmi

知道为什么我在尝试从 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/

相关文章:

java - RMI:什么变化需要重新编译 impl 类

java - Java RMI + SSL +压缩=不可能!

java - 是否可以在 RMI 中通过引用传递?

Java org/objectweb/asm/ClassVisitor 未找到

java - 从 403MB(是的,我有这个权利)html 文件中有效提取特定表

java - Spring Boot应用程序部署在远程服务器上

java - jFreeChart。组合图表错误内子图的高度?

java - 使用SSLSocketFactory后连接到twitter

java - 使用 editcell 启用卡住 jqgrid

java - 设置 SOAP 服务的内容类型