TCP/IP を使用して Java でマルチクライアント/サーバー アプリケーションを開発しています。私のサーバーは、clientSockets (clientSocket = serverSocket.accept();) ごとに新しいスレッドを作成します。問題は、実行中のすべてのスレッドがお互いを認識する方法を見つけ出すことにあるようです (つまり、チャットですべてのオンライン ユーザーにメッセージをブロードキャストするため)。新しいユーザーがサーバーに接続したとき、およびユーザーがサーバーから切断したときを、各スレッドが知る効率的な方法は何ですか?
1 に答える
私はあなたの立場で、ソケットスレッドとメッセージキューへの参照を持つ追加のキュースレッドを作成します。すべてのソケット スレッドは、すべてのソケット スレッドにメッセージを送信するキュー スレッドにメッセージをキューに入れることができます (したがって、ソケット スレッドにはキュー スレッド/キューへの参照が必要です - 同期!)。
ArryList を期待する必要がありますか。ソケットスレッドの数が変更される可能性があるため、イテレータを使用して反復する必要があります。
コメントで質問に答えるには: パフォーマンス
接続ごとにスレッドを開始すると、リソースが大量に消費されます (10.000 接続を想像してください)。そのため、他の方法で対処することもできます。
私は間違いなくミナと一緒に行きます:
Apache MINA は、ユーザーが高性能でスケーラビリティの高いネットワーク アプリケーションを簡単に開発できるようにするネットワーク アプリケーション フレームワークです。Java NIO を介して、TCP/IP や UDP/IP などのさまざまなトランスポートを介して、抽象的なイベント駆動型の非同期 API を提供します。
ネット上にはMINAのチュートリアルがたくさんあります。
ちょっとやり過ぎかもしれませんが、興味のある方は一見の価値ありです。
[編集]
クライアント数が 10 ~ 15 の場合は、接続ごとにスレッドを使用しても問題ありません…