【问题标题】:Java RMI connection to localhost at home network can't find correct remote moduleJava RMI 连接到家庭网络中的 localhost 找不到正确的远程模块
【发布时间】:2026-02-14 01:25:01
【问题描述】:

我一直在从事这个项目,其中不同机器上的两个模块需要通过 RMI 进行通信。

我在笔记本电脑上同时启动客户端和服务器模块。当我在工作并连接到工作网络时,RMI 似乎可以正常工作,但是当我在家时,连接到我的家庭网络时它不起作用。它说找不到远程对象。

这是我在客户端获取远程对象引用的方法

public static MyRMIApp getRemoteApp() throws RemoteException, NotBoundException, AccessException {
    Registry registry = LocateRegistry.getRegistry("localhost", 28999); // tried 127.0.0.1 instead of localhost here, still not working
    MyRMIApp app = (MyRMIApp) registry.lookup("COM");
    return app;
} 

通过一些调试挖掘了一下,当我检查从 getRemoteApp 方法返回的对象值时,它显示终点是 67.215.65.132。这是我用来连接互联网的openDNS。那不应该是 127.0.0.1 吗?

然后我使用我的移动互联网并再次尝试。它似乎正在工作,但端点又不是 127.0.0.1 它是分配给我的地址,即 192.168.x.x

那么任何人都可以告诉我我在这里做错了什么吗?我真的很感激帮助。

哦,这是服务器端的代码

//Somwhere up top
private final static MyRMIApp rmiApp = new RMIServer();

//Down below
MyRMIApp stub = (MyRMIApp) UnicastRemoteObject.exportObject(rmiApp, 0);
        Registry registry = LocateRegistry.createRegistry(28999);
        registry.rebind("COM", stub);

【问题讨论】:

  • 我不确定,但我建议您尝试更改远程对象导出到的端口号,因为 0 是众所周知的端口号,并且其他一些服务可能已经在监听它。只需将其更改为 1023 以上。
  • 好的,按照你的建议做了,尝试使用端口 1112,但它仍然是一样的。值为 Proxy[MyRMIApp,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:[67.215.65.132:1112](remote),objID:[2723e75d:1357d203dd7:-7fff, -8442143534524841902]]]]] 自然异常是:Exception在线程“主”java.rmi.ConnectException:连接拒绝主机:67.215.65.132;嵌套异常是:
  • 能否请您发给我完整的源代码。我想自己调试它。我还发现了这个链接,人们似乎在讨论与你相同的问题:coderanch.com/t/487650/java/java/…。但是我没有看到任何解决方案。你可能想看看。
  • 好的,现在我检查了你给我的链接,我添加了 -java.rmi.server.hostname=localhost 到 VM 参数。它确实以 localhost:53886 正确地获得了端点,并且代码有效。我在链接docs.oracle.com/javase/1.4.2/docs/guide/rmi/… 上检查了这个rmi 属性java.rmi.server.hostname,它说默认情况下rmi 注册表返回分配给我的IP 地址。我明白为什么我在其他网络上获得我的 IP 地址,但仍然不明白为什么我在家庭网络上获得 openDNS。现在我可以在家工作了。仍然想知道为什么它会这样工作
  • 我猜测 localhost 如何解析为 ip 地址可能存在问题。可能是注册表尝试使用 openDns 解析 localhost,但 openDns 正在返回其自己的服务器之一的 IP,而不是 127.0.0.1。看看这个与这个解决问题相关的线程,虽然与 rmi 无关 - forums.comcast.com/t5/Connectivity-and-Modem-Help/…

标签: java registry localhost rmi


【解决方案1】:

请参阅RMI FAQ 的 A.1 项:具体而言,“适当的解决方法是在启动服务器时设置系统属性 java.rmi.server.hostname。”

【讨论】: