0

RMI が使用するポート全体の数を N (N = RMI UnicastRemoteObject の数) から 2 + N に減らすにはどうすればよいですか?

さらに説明させてください。RMI を使用してクライアント/サーバー通信を実行するシステムがあります。2 つのインターフェイスがあります。簡単にするために、それらをクライアントとサーバーと呼びます。RMI レジストリはサーバーと同じ JVM で実行され、ポート (4000 など) にバインドされます。サーバーは、ポート番号のない UnicastRemoteObject としてエクスポートされ、引数のないコンストラクターに従って匿名ポートにバインドされます。

クライアントが起動すると、レジストリのルックアップから取得したサーバー実装で void hello(Client client) メソッドを呼び出します。渡された Client 実装も UnicastRemoteObject です。2 つのインターフェイスを介したクライアントとサーバー間の双方向通信を提供します。問題は、クライアントの UnicastRemoteObject も独自の匿名ポートでリッスンしていることです。

つまり、N 個のクライアントを使用するには、1 + 1 + 3 * N 個のポートを使用できる必要があります。2 + N はリスニングで、2 * N はエフェメラルです。(レジストリ + サーバー インスタンス + クライアントごとに 1 つのリッスン ポート、クライアントごとのエフェメラル ポート、サーバーごとのエフェメラル ポート)。通常、約 30 のクライアントがあり、92 個のポートがあります。これを 32 個のポート (1 + 1 + 各クライアントのエフェメラル ポート) まで減らすことができると思いますが、純粋な RMI でそれを行う方法がわかりません。

RMI を必要とせず、インターフェイスを書き直す必要もない他のソリューションも喜んで受け入れます。

4

1 に答える 1

2

ここで何が問題なのかわかりません。非準拠のサーバー ソケット ファクトリを記述していない限り、エクスポートされた RMI オブジェクトはすべてデフォルトで同じポート番号を共有します。の Javadoc で説明されているように、それらを構築またはエクスポートするときに使用するポート番号を指定できますUnicastRemoteObject。オブジェクトとレジストリを JVM で起動するときに、オブジェクトとレジストリに同じポートを使用できます。92 個のポートは、すべてのサーバー ホストとクライアント ホストに分散されているため、たとえ正確であっても、リソース カウントとしてあまり意味がありません。

于 2012-12-02T18:02:02.900 に答える