0

LAN 内のサーバーに接続するマルチクライアント アプリケーションに取り組んでいます。

すべてのクライアントは、サーバーのステータスを変更するコマンドを送信できます。この「ServerStatus」は、私が呼ぶように、いくつかの値を持つオブジェクトです。

ServerStatus が変更された場合、すべてのクライアントがすぐにそれを知る必要があります。私の考えは、次のように動作することでした:

サーバーは、毎秒 ServerStatus の versionNumber を使用して、リッスンしているすべてのクライアントにマルチキャストを送信します。そのため、新しいクライアントがマルチキャスト グループに参加すると、バージョン番号が同じかどうかを確認できます。そうでない場合、クライアントは UDP 経由で ServerStatus の現在のバージョンを問い合わせます。

クライアントが ServerStatus を変更するコマンドを送信すると、サーバーは現在の (および新しい) ServerStatus を同じマルチキャスト グループに送信しますが、別のスレッドでは ServerStatus のバージョン番号が毎秒共有されます。

これはこれに対処する良い方法だと思いますか?それとも、これはあまりにも多くの問題を引き起こしますか...など

4

2 に答える 2

1

新しい ServerStatus がクライアントに到達しない場合はどうなりますか? 私の意見では、新しいステータスをクライアントに送信するときに UDP を使用するべきではなく、信頼できるプロトコルを使用する必要があります。したがって、これでマルチキャストを使用する場合は、信頼できるマルチキャスト プロトコルを取得する必要があります。


一方、サーバーとのクライアント同期を好む場合があります。

  • クライアントがネットワークに入るたびに、サーバーにstatusidを尋ね(同じでない場合、サーバーはサーバーに ServerStatus を送信します)、クライアントは新しいステータス変更イベントも登録します。(TCP)

  • 退出時に、クライアントは UNREGISTER メッセージ (UDP) を送信できます。

  • ServerStatus が変更されるたびに、サーバーは新しい ServerStatus を登録済みの各クライアントに送信します。新しい Serverstatus を受信すると、クライアントは ack のようなものをサーバーに送信します (TCP)。

  • サーバーが ack を受信しなかった場合、問題のクライアントは登録解除されます (エラーにより、クライアントが登録解除せずにネットワークを離れたことを意味するため)。

お役に立てれば..

于 2012-10-22T15:10:00.260 に答える
1

基本的に、あなたのアイデアは私には良いと思います。 「グループ通信
」 のプリンシパルをさらに掘り下げ、 jGroupsなどのフレームワークを見てください。JBoss Cache がそれを使用してノード間でデータを分散することを知っています。 信頼性のために、クライアントは X 秒に 1 回サーバーにクエリを実行して、正しいバージョン番号を確認する か、少なくとも起動時/クラッシュからの回復時にこれを実行する必要があります。

于 2012-10-22T15:40:45.057 に答える