1

私は現在、実行を手伝っている夏のプログラムの出席を管理する小さなプロジェクトに取り組んでいます。RMI サーバーはオフィスから実行され、次のコードを使用して特定のポートが設定されています。

Registry registry = LocateRegistry.createRegistry(4051);
RemoteManager stub = (RemoteManager) UnicastRemoteObject.exportObject(theServer, 4051);
registry.rebind(SERVER_NAME, stub);

wheretheServerは、システムのサーバーとして機能するオブジェクトへの参照であり、サーバーを表すために使用されるSERVER_NAME単なる静的です。String示されているように、レジストリはサーバーをポートにバインドして4051、クライアントがクエリできるようにします。現在、サーバーと複数のクライアントインスタンス(同じクライアントプログラムを実行している12人の教師)間の相互通信に取り組んでおり、現在、クライアントstubsがクライアント登録のためにサーバーに自分自身を送信するように設定されています.

public void registerClient(INTERFACE_Client teach) throws RemoteException {
.
.
.
}

whereINTERFACE_ClientRemoteインターフェイスを拡張し、クライアントは次の呼び出しによって送信されます。

server.registerClient((INTERFACE_Client) UnicastRemoteObject.exportObject(this, 4052));

4052自分が何をしているのかわからなかったので、ポートを選択しました。また、スタブをレジストリにバインドしませんでした。それを行う良い方法はありますか?クライアント ポートをハードコードしたため、12 人の教師全員がそれぞれのクライアント インスタンスからポート 4052 を使用してオブジェクトをエクスポートします (少なくとも私はそう見ています)。ポートをランダム化する必要がありますか? ポートを含めるべきではありませんか (それを必要としない方法もあります)。役立つヒントがあれば大歓迎です。

免責事項として、オフィスのユーザーが教師にメッセージを送信できるように、サーバー内のクライアントへの参照が必要です。(サーバー -> クライアント通信)。クライアントはレジストリで参照できるため、サーバーへの参照を既に持っています。
なにか提案を?

4

1 に答える 1

0

何をしているのかわからなかったので、ポート 4052 を選択しました。

ファイアウォールが存在する場合、両方の中間ファイアウォールでポート 4052 が両方向に開いていれば問題ありません。両端で RMI レジストリ ポート 1099 を使用できない本当の理由はありません。ホストに他の RMI アプリケーションが既に含まれていない限り、IANA によって既に予約されています。

また、スタブをレジストリにバインドしませんでした。それを行う良い方法はありますか?

それで大丈夫です。クライアントにレジストリは必要ありません。必要なのは、既存の登録 API だけです。

クライアント ポートをハードコーディングしたため、12 人の教師全員がそれぞれのクライアント インスタンスからポート 4052 を使用してオブジェクトをエクスポートします (少なくとも私はそう見ています)。

「クライアント インスタンス」がすべて個別の TCP ホストである限り、問題ありません。

ポートをランダム化する必要がありますか?

TCPホストごとに1つ以上のクライアントがない限り、そうではありません。

ポートを含めるべきではありませんか (それを必要としない方法もあります)。

いいえ。

役立つヒントがあれば大歓迎です。

クライアントはリモート インターフェイスを実装し、エクスポートしてから、既存の API を介してサーバーに登録する必要があります。元気です。ファイアウォールがない限り、またはそれらがすべてあなたの管理下にある限り、問題はありません。

于 2013-07-11T08:15:43.163 に答える