2012-01-18 22 views
4

私は機能するRMIクライアント - サーバシステムを持っています。サーバーのホスト情報はクライアントに知られているため、クライアントは検索して呼び出しを行うことができます。サーバーへの最初の呼び出しで、クライアントはサーバーにコールバックを行うことができるように、サーバーに「自分自身」のリモート参照を渡します。サーバーは、接続されているすべてのクライアントのリストを保持します(クライアントがサーバーから「登録を解除」し、クライアントが到達可能かどうかを定期的にチェックし、そうでないクライアントを削除するスレッドがあります)。RMI:リモートオブジェクトのIPアドレスを決定する

サーバーにはグラフィカルインターフェイス(Webアプリケーションの一部)があり、ユーザーはいつでも接続されているクライアントを視覚化できます。今、このインターフェースにクライアントのIPアドレスを表示するように求められます。

私の質問:リモートオブジェクト(スタブ)のリモート参照がある場合、このリモートオブジェクトが実際に存在するホスト(DNS名またはIPアドレス)を簡単に判別できますか?

注:クライアントが初めて情報を接続して保存するときにRemoteServer.getClientHostを使用するか、ホスト情報を返すクライアントでリモートメソッドを実装することができますが、組み込みのRMI方法があるかどうかを知りたいリモート参照でそれを行うこと。

+0

あなたの質問は不明です。 RemoteServer.getClientHost()は、リモートオブジェクトのアドレスではなく、クライアントのアドレスを返します。とにかくリモートオブジェクトのアドレスは何を使用していますか? RMIでそれを行うことはできません。 – EJP

+0

はい、この場合、リモートオブジェクトのアドレスが必要でした。 RMI呼び出しやそのようなものではなく、GUIに表示するだけです... –

答えて

1

RMISecurityManagerとUnicastRemoteObjectはそれについて何も言わない。
クライアントの接続時にRemoteServer.getClientHostを使用できます。
リモートメソッド呼び出しで渡されない限り、この情報が得られるとは思いません。

+0

私は同じ結論に達しました。私はRemoteServer.getClientHostを使用して、クライアントが接続し、別の場所で使用する情報を保存します。 –

+1

'RemoteServer.getClientHost()'はあなたにリモートオブジェクトのIPアドレスを与えません。現在のリモートオブジェクトの*クライアント*のIPアドレスを返します。 – EJP

-1

注:コメントはこちらを参照してください。

クライアントのIPアドレスをGUIに表示するのと同じ要件があります。 NotExpectedTypeExceptionが自己定義の例外である

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"); 
    } 

: リモートオブジェクトとそのサブオブジェクトのタイプをデバッグおよび分析した後、私は、次のコードを思いつきました。

instanceofがたくさん含まれているので、方法がどれほど信頼性が高いかわかりません。 しかし私はTCP接続を使用したLANで正常にテストしました。

+0

完全に無意味で、明示的に警告されている 'sun。*'クラスに完全に依存しています。 'RemoteServer.getClientHost()'は本当に必要なものです。 – EJP

+0

ありがとうございます。私は答えを追加する前に受け入れられた答えを見たが、私は 'RemoteServer.getClientHost()'の概念を理解することができなかった。主に静的メソッドであるためです。しかし、今私はそれがJavadocに記載されているように、現在のスレッドでリモートオブジェクトのIPアドレスを提供していることを知っています。例えば。私の場合、 'getIpAddress()'を 'RemoteServer.getClientHost()'に置き換えるだけで済むようになりました。 – gillesB

関連する問題