3

まず、この質問の実際のコードを投稿したいと思いますが、行数が多すぎるため投稿できません。そうは言っても、私の状況は次のとおりです。

サーバ側

サーバーがクライアントで関数呼び出しを行うことができるように、クライアントが接続して自分自身を「登録」するのを待つRMIサーバーがあります。基本的に、サーバーには、次の擬似コードのように機能する公開関数があります。

public class Server extends UnicastRemoteObject implements ServerInterface{
    public Server(){ /* Server publishes itself here */ }

    ...

    /** One of many methods visible to a remote Client */
    public void registerClient(Client c) throws RemoteException{
        //1. Make some remote calls on 'c' for book-keeping purposes
        //2. Store reference to c to make calls on it later
    }
}

クライアント側

起動時に、クライアントは を呼び出してNaming.lookup([url])サーバーへのスタブを取得しserverRef、それを呼び出してから を呼び出しますserverRef.registerClient(this)。問題は、サーバーのregisterClient(Client c)メソッドの最初の行で発生します。

問題

Clientサーバーがメソッドの内部に対して最初のリモート メソッド呼び出しを行うregisterClientと、RemoteException がスローされます。クライアント マシンとサーバー マシンは同じサブネット上にありますが、クライアントのマシンにはセカンダリ IP アドレスがあります。したがって、IP は次のようになります。

サーバー マシン IP: 123.45.67.1
クライアント マシンIP : 123.45.67.2、192.168.67.2

サーバーからクライアントへの最初のリモート コールバック中にスローされる RemoteException は、サーバーがクライアントの 192.168.67.2 アドレスに接続しようとしていることを示します。これが失敗の原因です。サーバーは 123.45.67.1 アドレスに接続しようとしているはずです。2 番目の IP アドレスに属するネットワーク インターフェイスを無効にすると問題が解決することはわかっていますが、これは実際には選択肢ではありません。

新しいクライアント側オブジェクト スタブへの接続を開くときに、接続する IP アドレスをサーバー側 RMI に「伝える」方法はありますか?

4

1 に答える 1

1

いくつかの可能な解決策があります。

  • カスタム クライアント ソケット ファクトリを作成する

  • java.rmi.server.hostname プロパティにアドレスを指定

    -Djava.rmi.server.hostname=ip_address

このリンクをチェックしてください:

次のリンクも役立ちます。

于 2012-04-27T16:58:36.560 に答える