我们在同一台计算机上使用客户端/服务器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时,就会发生这种情况。
执行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布尔值总是为假。
我不知道它是否足够清楚。遗憾!!!
你有什么建议吗?
我试过这个解决方案
但这些都没有奏效。
欢迎任何建议。
答案 0 :(得分:5)
java.rmi.server.hostname
should do the trick。你确实在服务器上设置了它,对吗?
如果java.rmi.server.hostname=localhost
不起作用,java.rmi.server.hostname=127.0.0.1
或java.rmi.server.hostname=::1
怎么办?
答案 1 :(得分:0)
您可以尝试使用此属性集-Djava.rmi.server.hostname=localhost
这是因为服务器绑定到接口127.0.0.1或192.168.x.x
答案 2 :(得分:0)
对不起,伙计们。我的错误。
正如您所指出的那样,我正在为客户端进程设置“java.rmi.server.hostname = localhost”参数。当我将参数设置为运行RMI服务器的进程时,它就像魅力一样运行。
非常感谢。