繁体   English   中英

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

[英]Why RMI localhost client uses a no localhost ip to connect the RMI localhost server

我们在同一台计算机上使用客户端/服务器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.xx; nested exception is: java.net.NoRouteToHostException: No route to host: connect

调试了一下我发现了

RemoteObject($ Proxy0) - > RemoteObjectInvocationHandler - > UnicastRef2 - > LiveRef - > 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的IP为192.168.xx,isLocal始终为false)
  3. 在URI中调用没有主机的重新绑定和查找。 这应该是localhost。

但这些都没有奏效。

任何建议都将受到欢迎。

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

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

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

另见第3.5.4节

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

对不起大家。 我的错。

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

非常感谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM