まず、この質問の実際のコードを投稿したいと思いますが、行数が多すぎるため投稿できません。そうは言っても、私の状況は次のとおりです。
サーバ側
サーバーがクライアントで関数呼び出しを行うことができるように、クライアントが接続して自分自身を「登録」するのを待つ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 に「伝える」方法はありますか?