RMI : 确定远程对象的 IP 地址

Posted

技术标签:

【中文标题】RMI : 确定远程对象的 IP 地址【英文标题】:RMI : determine the IP address of a remote object 【发布时间】:2012-01-18 13:29:40 【问题描述】:

我有正常运行的 RMI 客户端-服务器系统。服务器的主机信息对客户端来说是已知的,因此他们可以查找并进行调用。在第一次调用服务器时,客户端将“自己”的远程引用传递给服务器,以便服务器可以进行回调。服务器维护所有已连接客户端的列表(当客户端关闭时,它会从服务器“取消注册”,并且有一个线程会定期检查客户端是否可访问并驱逐不可访问的客户端)。

服务器上有一个图形界面(webapp 的一部分),允许用户随时可视化连接的客户端。现在我被要求在此界面中显示客户端的 IP 地址。

我的问题:在 RMI 中,如果您有远程对象(存根)的远程引用,是否有一种简单的方法来确定该远程对象实际所在的主机(DNS 名称或 IP 地址)?

注意:我可以在客户端第一次连接并存储信息时使用RemoteServer.getClientHost,或者我可以在客户端上实现一个返回主机信息的远程方法,但我想知道是否有内置 RMI使用远程引用的方式。

【问题讨论】:

您的问题不清楚。 RemoteServer.getClientHost() 为您提供客户端的地址,而不是远程对象的地址。无论如何,远程对象的地址有什么用?在 RMI 中你无能为力。 是的,在这种情况下,我确实需要远程对象的地址。不适用于 RMI 调用或类似的操作,仅用于在 GUI 中显示... 【参考方案1】:

RMISecurityManager 和 UnicastRemoteObject 对此一无所知。 当客户端连接时,您可以使用RemoteServer.getClientHost。 除非在远程方法调用中传递,否则我不相信可以获取到这些信息。

【讨论】:

我得出了同样的结论。我在客户端连接时使用 RemoteServer.getClientHost,然后将信息存储在其他地方使用。 RemoteServer.getClientHost() 不会为您提供远程对象的 IP 地址。它为您提供 current 远程对象的 client 的 IP 地址。【参考方案2】:

注意:不要使用这个,参见 cmets。

我有同样的要求,在 GUI 中显示客户端的 IP 地址。 在调试和分析远程对象及其子对象的类型后,我想出了以下代码:

  public static String getIpAddress(Object proxy) throws IllegalArgumentException, RemoteException, NotExpectedTypeException
  
    InvocationHandler h = Proxy.getInvocationHandler(proxy);
    if (h instanceof RemoteObjectInvocationHandler)
    
      RemoteRef remoteRef = ((RemoteObjectInvocationHandler) h).getRef();
      if (remoteRef instanceof UnicastRef)
      
        Endpoint ep = ((UnicastRef) remoteRef).getLiveRef().getChannel().getEndpoint();
        if (ep instanceof TCPEndpoint)  return ((TCPEndpoint) ep).getHost(); 
        throw new NotExpectedTypeException(ep.getClass().getSimpleName(), "TCPEndpoint");
      
      throw new NotExpectedTypeException(remoteRef.getClass().getSimpleName(), "UnicastRef");
    
    throw new NotExpectedTypeException(h.getClass().getSimpleName(), "RemoteObjectInvocationHandler");
  

NotExpectedTypeException 是一个自定义异常。

我不确定这个方法有多可靠,因为它包含很多instanceofs。 但是我在使用 TCP 连接的 LAN 中成功测试了它。

【讨论】:

完全没有意义,并且完全依赖于 sun.* 明确警告您不要依赖的类。 RemoteServer.getClientHost() 是你真正需要的。 感谢您指出这一点。在添加答案之前,我已经看到了接受的答案,但我无法理解RemoteServer.getClientHost() 的概念。主要是因为它是一个静态方法。但现在我知道它提供了当前线程中远程对象的 IP 地址,如 Javadoc 中所述。例如。在我的情况下,我只需要将我的getIpAddress() 替换为RemoteServer.getClientHost()

以上是关于RMI : 确定远程对象的 IP 地址的主要内容,如果未能解决你的问题,请参考以下文章

RMI的概念

JAVA RMI远程通讯

Java学习笔记之RMI远程方法调用

获取远程套接字端点的 IP 地址

使用JvisualVM无法连接linux远程服务器,错误无法使用service:jmx:rmi:// /jndi/rmi://ip:port/jmxrmi

如何传递导出的 RMI-IIOP 对象的远程引用