【发布时间】:2011-05-14 13:38:09
【问题描述】:
我们在同一台计算机上使用客户端/服务器 RMI 通信(所以所有 ip 都应该是 localhost)。
我们启动注册表(使用默认端口 1099)
registry = LocateRegistry.createRegistry(port);
并将一些对象导出到 RMI 注册表
Naming.rebind("//" + "localhost" + ":" + port + "/" + name, object);
我们从另一个进程中检索一些对象(记住一切都在 localhost 中运行)
MyRemoteObject ro = (MyRemoteObject) Naming.lookup("//" + "localhost" + ":" + port + "/" + name);
当您从局域网工作开始运行应用程序并在此过程中禁用网络连接时,会出现此问题。 如果您运行应用程序并且 LAN 正常工作,则没有问题弹出窗口,如果您运行应用程序并且 LAN 不工作,则没有问题弹出窗口。当您在运行应用程序时更改 LAN 时才会发生这种情况。
执行 Naming.lookup() 方法时抛出的异常是这个:
java.lang.RuntimeException: java.rmi.ConnectIOException: Exception creating connection to: 192.168.x.x; nested exception is:
java.net.NoRouteToHostException: No route to host: connect
调试了一下发现
RemoteObject ($Proxy0) -> RemoteObjectInvocationHandler -> UnicastRef2 -> LiveRef -> TCPEndpoint
拥有主机的 ip(例如:192.168.x.x)而不是“localhost”或 127.0.0.1(这将是我想要的)。 并且 liveRef 对象的 isLocal 布尔值始终为 false。
我不知道它是否足够清楚。对不起!!!
你有什么建议吗?
我的尝试:
我试过这个解决方案
- 使用 -Djava.rmi.server.hostname=localhost 参数运行 jvm
- 重新定义 RMIServerSocketFactory 以每次返回 127.0.0.1。 (TCPEndpoint 有 192.168.x.x ip 并且 isLocal 总是假的)
- 在 URI 中没有主机的情况下调用重新绑定和查找。这应该是指本地主机。
但这些都没有奏效。
欢迎提出任何建议。
【问题讨论】:
标签: java connection localhost rmi