0

サーバーに対して行われた最初のRMI呼び出しから一定時間後に、サーバーがコールバックを使用して複数のクライアントに通知するようにします。

つまり、サーバーは一定時間待機するため、複数のクライアントが参加できます

//server code
void connect (callback) {

thread.sleep(time)
callback.notify()

}

しかし、何が起こるかというと、すべてのクライアントが同時にコールバックを取得するわけではありません。バリエーションは、サーバーへのrmi呼び出しを行う時間によって異なります。方法すべてのクライアントが同時に通知を受け取るようにする方法。

私はRMIに不慣れで、クライアントサーバーメカニズムを実装しようとしています。

4

2 に答える 2

1

できません。それらを 1 つずつコールバックすることですでに同時性が失われるか、並列でコールすることになります。この場合、スレッドの実行を制御することはできません。また、どちらの場合も、パケットの送信方法を制御することはできません。ネットワークに。

ここでの問題は要件自体であり、それを実装する方法ではありません。最初の電話の後に一定の時間が必要なのはなぜですか? その一定時間内にすべての可能なクライアントが接続されていることをどのように知ることができますか? すべてのクライアントが同時に通知を受け取る必要があるのはなぜですか? なぜコールバックが必要なのですか? 多くの場合、RMI のコールバックは設計が不十分であることを示しており、ネットワーク管理者は、セキュリティ上の理由から、あらゆる種類のコールバックを非常に疑っています。

一般的なクライアント サーバー メカニズムにはコールバックは必要ありません。RMI はすでにクライアント サーバー メカニズムです。

于 2012-10-02T06:49:12.323 に答える
0

RMIを使用してからかなりの時間が経ちました
が、これは問題のある要件であるという他の回答に同意します。
ただし、この要件が必須である場合は、RMI 呼び出しを処理する各サーバー スレッドごとに connect が呼び出されるという問題を正しく理解していることを期待
して、提案しようとしているようなものを実装しようとします。 次のことをお勧めします - RMI サーバー スレッド間で共有データ構造を実装します (つまり、"connect" メソッドの呼び出しを実行するスレッド)。. 共有データ構造は、java.util.Date (またはミリ秒を表す Long) からコールバックのリストへの同時マップにすることができます。 connect のコードは、次の疑似コードを実行します。





を。コールバックに通知したい日付オブジェクトのエントリがあるかどうかを確認します。
そのようなエントリがない場合は、作成してマップに配置し、newEntry フラグに「true」を設定します
。リストにコールバックを追加します。
c. 「newEntryFlag」が設定されている場合は、ScheduledThredPoolExectuorを使用して、日付オブジェクトの時刻に達したときに呼び出されるタスクをスケジュールします。
d. タスクの時間に達すると、タスクの run メソッドが共有マップからコールバック リストを取得し、コールバックごとに notify メソッドを呼び出します。

もちろん、ここで同期を適切に処理する必要がありますが、それを管理できると確信しています。

于 2012-10-02T06:50:29.643 に答える