gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:19:20 28 4
gpt4 key购买 nike

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

我们启动注册表(使用默认端口1099)


registry = LocateRegistry.createRegistry(端口);

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


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

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


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

当您在局域网正常运行的情况下运行应用程序并在过程中禁用网络连接时,会发生此问题。如果您运行该应用程序并且 LAN 工作正常,则不会弹出任何问题,如果您运行该应用程序并且 LAN 不工作,则不会出现任何问题弹出窗口。当您在运行应用程序时更改 LAN 时,它只会发生。

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


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

调试了一下我发现

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

有主机的 ip(例如:192.168.x.x)而不是“localhost”或 127.0.0.1(这是我想要的)。并且 liveRef 对象的 isLocal boolean 值始终为 false。

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

你有什么建议吗?

我的尝试:

我试过这个解决方案

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

但这些都没有用。

欢迎提出任何建议。

最佳答案

java.rmi.server.hostname should do the trick .你确实在服务器上设置了它,对吧?

如果 java.rmi.server.hostname=localhost 不起作用,java.rmi.server.hostname=127.0.0.1java. rmi.server.hostname=::1?

关于java - 为什么 RMI localhost 客户端使用 no localhost ip 连接 RMI localhost 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4258016/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com