RMI中にクライアントとサーバーの両方のポート番号を知る方法はありますか?
誤解していなければ、RMIセッション中にポート番号を知る方法はないと思います。
デフォルトのRMIレジストリServer1099ポートとは異なるポート番号を使用している場合は、サーバークラスとクライアントクラスでポート番号を設定する必要があります。これは、OracleRMIページで次のように報告されているためです。
レジストリが1099以外のポートで実行される場合は、サーバークラスとクライアントクラスのLocateRegistry.getRegistryの呼び出しでポート番号を指定する必要があります。たとえば、この例でレジストリがポート2001で実行されている場合、getRegistry
サーバーでのへの呼び出しは次のようになります。
Registry registry = LocateRegistry.getRegistry(2001);
と:
このクライアントは、最初に、コマンドラインで指定されたホスト名を使用して静的LocateRegistry.getRegistryメソッドを呼び出すことにより、レジストリのスタブを取得します。ホスト名が指定されていない場合は、ローカルホストアドレスを使用する必要があることを示すホスト名としてnullが使用されます。
次に、私の結論は、デフォルトのRMIと異なる場合は、設定する必要がある場合を除いて、RMIセッションのポート番号をメソッドで知ることはできないということです(詳細についてはRMI APIを確認できます)。レジストリサーバー1099ポート。これは、RMIセッションの開始時にそれを知る必要があるためです。
考えてみてください:このポート番号を取得するにはどうすればよいですか?サーバーまたはクライアントに接続していますか?たとえば、ポート81(デフォルトの80ポートではない)をリッスンしている特定のサーバーにあるページを要求する場合、この特定のサーバーに接続するためのポート番号を事前に必要とします。http://192.168.1.1:81
。次に、RMIセッション中に、RMIレジストリポートを事前に知っておく必要があります。
詳しくはこちらのページをご覧ください。
RMI中に結果がクライアントに返されると、次にクライアントが結果を要求したときに、最初の結果が返されてからサーバーが実行されているとき、または新しい結果が返されているときに、クライアントとサーバー間の会話は以前と同じポートで行われます。ポートが作成されますか?
結果がクライアントに返されるとき、クライアントとサーバー間の会話は同じRMIレジストリポートで共有する必要があります。そうでない場合、クライアントに設定されたRMIレジストリポートがサーバーのRMIレジストリポートと異なる場合(私がしなかった場合)忘れた)、コードはRemoteException
、RMIプロセスで障害が発生したときに発生する可能性のあるをスローします。
アップデート
今、私はあなたの更新された質問を見ます。
2つの異なる呼び出しで、クライアントとサーバーのポート番号は同じままですか?
同じRMIレジストリサーバーポートである必要があります。プログラムが最初の呼び出しの後に終了すると、プログラムはソケット接続を閉じます。次回プログラムを起動するときは、RMIレジストリポートは同じである必要があります。そうしないと、プログラムで例外がスローされるか、プログラムに引数を渡すと、予期しない結果が発生します。私が理解しているのであれば、クライアントプログラムはサーバー上でsumメソッドを呼び出すだけです。最初の結果の後、次にプログラムを開始したときに、別の結果が得られますか?そうでない場合は、RMIレジストリポートは同じだと思います。