4

RMI 中にクライアントとサーバーの両方のポート番号を知る方法はありますか?

RMI 中にクライアントに結果が返された場合、次にクライアントが結果を要求するとき、クライアントとサーバー間の会話は以前と同じポートで行われますか?ポートが作成されますか?

例えば ​​:

// call to a remote method add
     addServerIntf.add(d1,d2)
// after this call i get the added result

// again call the add method by again starting the client
    addServerIntf.add(d1,d2)
// I get the result back as usual

2 つの異なる呼び出しで、クライアントとサーバーのポート番号は同じままですか?

java AddClient localhost 100 200 のようなコマンドを入力した後、クライアント プログラムが終了します。 サーバー上のメソッドは 300 を返し、クライアントは終了します。次回は、Java AddClient localhost 19 100 でクライアントを再度起動します。リクエストは以前に送信されたのと同じポートから送信され、サーバーは同じポートでリクエストを受信しますか? それとも今書いたのと状況が違うのですか?

4

3 に答える 3

3

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レジストリポートは同じだと思います。

于 2011-12-21T16:21:53.213 に答える
2

クライアントとサーバーの両方のポート番号を知る方法はありますか?

いいえ。クライアントのポート番号は、接続時に動的に割り当てられるため、事前に知ることはできません。また、サーバーの IP:port は取得できないスタブに埋め込まれています。なぜあなたは知る必要があるのですか?情報はあまり役に立ちません。使用できません。

RMI 中にクライアントに結果が返された場合、次にクライアントが結果を要求するとき、クライアントとサーバー間の会話は以前と同じポートで行われますか?ポートが作成されますか?

また:

  • クライアント接続が同じポート番号で再利用される、または
  • おそらく新しいローカル ポートとの新しい接続がクライアントで作成されます。

どれかを判断することは不可能です。サーバーポートは固定のままです。

2 つの異なる呼び出しで、クライアントとサーバーのポート番号は同じままですか?

上記を参照。

のようなコマンドを入力すると、クライアント プログラムが終了しますjava AddClient localhost 100 200。サーバー上のメソッドは 300 を返し、クライアントは終了します。次回は、クライアントをもう一度起動しjava AddClient localhost 19 100ます。以前に送信されたのと同じポートからリクエストが送信されるようになりました

おそらくそうではありません。

サーバーは同じポートでリクエストを受信しますか?

サーバーコードを見ずに言うことは不可能です。定数ポートでエクスポートした場合、定数ポートでエクスポートされます。そうでなければ、そうではありません。まさにトートロジー。

それとも今書いたのと状況が違うの?

質問がわかりません。

于 2011-12-23T02:49:55.833 に答える
-1

TCP/IP を理解する: クライアントは特定のポートでサーバーに接続します。クライアントのポート番号はランダムです (またはセキュリティ上の理由から)、サーバーのポート番号は既知です (そうでなければ、クライアントが最初に接続する方法はありません)。

次に、TCP/IP プロトコルが接続を確立します。サーバーは接続用のハンドラーを作成し、TCP/IP はこの接続に新しいランダムなポートを割り当てます。サーバー側のポート番号は変わりません。サーバーはクライアントの IP+ ポートをキーとして使用して異なる「セッション」を区別できるため、任意の数のクライアントが同じサーバー ポートに接続できます。

これは、RMI フレームワークが初期化された後、クライアントとサーバーの両方が、接続が存在する限り変更されないポートのペアを介して互いに通信することを意味します。

何らかの理由で接続が切断された場合、新しい接続を確立できますが、おそらくクライアント側の両側で新しいポート番号sを取得します。

クライアント プログラムが終了する

これは、接続が切断されたことを意味します。クライアントを再起動すると、新しいクライアント ポートが作成されます。ほとんどの場合 (およそ 1 である 65534:65535 の可能性があります)、新しいポート番号になります。

2 分以内にクライアントを再起動する場合、「リモート TCP が接続終了要求の確認応答を受信した」ことを確認するために、古いポート2 分間保持されるため、ポート番号は異なる必要あります ( .これらはステータスとともに表示されます)。netstatTIME_WAIT

于 2011-12-21T16:28:25.770 に答える