簡體   English   中英

RMI:確定遠程對象的IP地址

[英]RMI : determine the IP address of a remote object

我有功能RMI客戶端 - 服務器系統。 客戶端知道服務器的主機信息,因此他們可以查找並撥打電話。 在第一次調用服務器時,客戶端向服務器傳遞“自己”的遠程引用,以便服務器可以進行回調。 服務器維護所有連接的客戶端的列表(當客戶端從服務器關閉它“取消注冊”時,並且有一個線程定期檢查客戶端是否可訪問並驅逐那些不是的客戶端)。

服務器上有一個圖形界面(webapp的一部分),允許用戶隨時可視化連接的客戶端。 現在我被要求在此界面中顯示客戶端的IP地址。

我的問題:在RMI中,如果你有一個遠程對象(存根)的遠程引用,有沒有一種簡單的方法來確定這個遠程對象實際存在的主機(DNS名稱或IP地址)?

注意:當客戶端首次連接並存儲信息時,我可以使用RemoteServer.getClientHost ,或者我可以在返回主機信息的客戶端上實現遠程方法,但我想知道是否有內置的RMI方法它與遠程引用。

RMISecurityManager和UnicastRemoteObject沒有提及任何相關內容。
您可以在客戶端連接時使用RemoteServer.getClientHost
除非在遠程方法調用中傳遞,否則我不相信可以獲得此信息。

注意:請勿使用此功能,請參閱注釋。

我有相同的要求,在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是一個自定義的異常。

我不確定該方法的可靠性,因為它包含很多instanceof 但是我在使用TCP連接的局域網中成功測試了它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM