【问题标题】:Why RMI localhost client uses a no localhost ip to connect the RMI localhost server为什么 RMI localhost 客户端使用无 localhost ip 来连接 RMI localhost 服务器
【发布时间】: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。

我不知道它是否足够清楚。对不起!!!

你有什么建议吗?

我的尝试:

我试过这个解决方案

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

但这些都没有奏效。

欢迎提出任何建议。

【问题讨论】:

    标签: java connection localhost rmi


    【解决方案1】:

    java.rmi.server.hostnameshould do the trick。你是在服务器上设置的吧?

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

    【讨论】:

    • +1 可能令人困惑的地方:您必须将此选项提供给 RMI 服务器,而不是客户端。为什么?如果你忽略它,服务器会将自己绑定到公共 IP 地址(而不是 localhost),并且客户端足够聪明地找到它。
    • 如果只有 IPv6 处于活动状态呢? 127.0.0.1 会自动翻译成 ::1 吗?
    • 如果只有 IPv6 处于活动状态,那么只需“localhost”就可以了。您也可以尝试将其设置为“::1”,看看是否有效。 “127.0.0.1”对 IPv6 网络堆栈毫无意义,AFAIK。没有自动翻译。
    【解决方案2】:

    对不起,伙计们。我的错误。

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

    非常感谢。

    【讨论】:

      【解决方案3】:

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

      另见Section 3.5.4

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

      【讨论】:

        猜你喜欢
        • 2021-05-17
        • 1970-01-01
        • 1970-01-01
        • 2019-10-05
        • 2010-12-21
        • 1970-01-01
        • 2014-05-04
        • 1970-01-01
        相关资源
        最近更新 更多