【发布时间】: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