为什么 RMI localhost 客户端使用 no localhost ip 来连接 RMI localhost 服务器

发布于 2024-10-03 15:54:12 字数 1304 浏览 4 评论 0原文

我们在同一台计算机上使用客户端/服务器 RMI 通信(因此所有 IP 都应该是 localhost)。

我们启动registry(使用默认端口1099)

注册表 = LocateRegistry.createRegistry(port);

并将一些对象导出到 RMI 注册表

Naming.rebind("//" + "localhost" + ":" + 端口 + "/" + 名称,对象);

从另一个进程中,我们检索一些对象(记住所有内容都在本地主机中运行)

MyRemoteObject ro = (MyRemoteObject) Naming.lookup("//" + "localhost" + ":" + 端口 + "/" + 名称); 。

当您从局域网工作开始运行应用程序并在过程中禁用网络连接时,就会出现此问题 如果您运行该应用程序并且 LAN 正在工作,则不会出现问题弹出窗口;如果您运行该应用程序并且 LAN 无法工作,则不会出现问题弹出窗口。当您在运行应用程序时更改 LAN 时,就会发生这种情况。

执行 Naming.lookup() 方法时抛出的异常是:

java.lang.RuntimeException:java.rmi.ConnectIOException:创建连接到的异常:192.168.xx;嵌套异常是: java.net.NoRouteToHostException:没有到主机的路由:连接 调试了

一下我发现 RemoteObject

($Proxy0) ->远程对象调用处理程序 -> UnicastRef2->实时参考 -> TCPEndpoint

具有主机的IP(例如:192.168.xx)而不是“localhost”或127.0.0.1(这将是我想要的)。 liveRef 对象的 isLocal 布尔值始终为 false。

不知道说的够不够清楚。对不起!!!

您有什么建议吗?

我的尝试:

我尝试了这个解决方案

  1. 使用 -Djava.rmi.server.hostname=localhost 参数运行jvm
  2. 重新定义RMIServerSocketFactory以每次返回127.0.0.1。 (TCPEndpoint 有 192.168.xx ip 并且 isLocal 始终为 false)
  3. 调用重新绑定并查找 URI 中没有主机的情况。这应该意味着本地主机。

但这些都没有奏效。

任何建议都将受到欢迎。

We are using a client/server RMI communication in the same computer (so all ip should be localhost).

We start the registry (using the default port 1099)


registry = LocateRegistry.createRegistry(port);

and export some objects to the RMI registry


Naming.rebind("//" + "localhost" + ":" + port + "/" + name, object);

From another process we retrieve some objects (remember everything runs in localhost)


MyRemoteObject ro = (MyRemoteObject) Naming.lookup("//" + "localhost" + ":" + port + "/" + name);

The issue happen when you run the app starting with local area network working and in the middle of the process you disable the network connection.
If you run the app and the LAN is working no issue popup, and if you run the app and the LAN is not working no issue popup. It just happens when you change the LAN while you are running the app.

The exception thrown while executing Naming.lookup() method is this one:


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

Debugging a little bit I found out that the

RemoteObject ($Proxy0) -> RemoteObjectInvocationHandler -> UnicastRef2 -> LiveRef -> TCPEndpoint

had the ip of the host (e.g.: 192.168.x.x) instead of "localhost" or 127.0.0.1 (what it would be what I wanted).
And the isLocal boolean of liveRef object is always false.

I don't know if it is clear enough. Sorry!!!

Do you have any suggestions?

My Tries:

I tried this solutions

  1. Run the jvm with -Djava.rmi.server.hostname=localhost argument
  2. Redefine RMIServerSocketFactory to return 127.0.0.1 everytime. (TCPEndpoint has 192.168.x.x ip and isLocal is always false)
  3. Call rebind and lookup with no host in the URI. This is supposed to mean localhost.

but none of these have worked.

Any suggestion will be welcome.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

離人涙 2024-10-10 15:54:12

java.rmi.server.hostname 应该可以解决问题。你确实在服务器上设置了它,对吗?

如果 java.rmi.server.hostname=localhost 不起作用,那么 java.rmi.server.hostname=127.0.0.1 或 java.rmi.server 怎么样? .hostname=::1?

java.rmi.server.hostname should do the trick. You did set it on server, right?

If java.rmi.server.hostname=localhost does not work, how about java.rmi.server.hostname=127.0.0.1 or java.rmi.server.hostname=::1?

忆离笙 2024-10-10 15:54:12

您可以尝试使用此属性集 -Djava.rmi.server.hostname=localhost 启动服务器

另请参阅第 3.5.4 节

这是因为服务器绑定到接口,127.0.0.1 或 192.168.xx

You could try to start your server with this Property set -Djava.rmi.server.hostname=localhost

See also Section 3.5.4

This because the server binds to an interface, either 127.0.0.1 or 192.168.x.x

西瓜 2024-10-10 15:54:12

抱歉,伙计们。我的错误。

正如您所指出的,我正在为客户端进程设置“java.rmi.server.hostname=localhost”参数。当我将参数设置为运行 RMI 服务器的进程时,它运行起来就像魅力一样。

多谢。

Sorry, guys. My Mistake.

As you point out I was setting the "java.rmi.server.hostname=localhost" argument to the clients processes. It runned like charm when I setted the argument to process which run RMI server.

Thanks a lot.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文