3

Java で作成しているインスタント メッセージ プログラムの 2 つの設計があります。

最初のアイデアは、2 つの別々のスレッドを使用します。最初のスレッドは GUI を無視し、ブロッキング ソケットへの書き込みを通じてインスタント メッセージ データを送信します。2 番目のスレッドは、別のブロッキング ソケットを使用して、フレンドからの受信パケットを監視します。スレッドを使用することがこの問題に対処するための最良の方法であるかどうかはわかりませんが、ノンブロッキング ソケットチャネルを使用するよりも処理が簡単であることがわかりました。

私が持っている 2 番目の設計は、非ブロッキング ソケット チャネルを 1 つのスレッドで使用することです。これは、着信データまたは発信データがあるかどうかを時折チェックします。この設計の良いところは、スレッド間のリソース共有について心配する必要がないことですが、より効率的かどうかはわかりません。

正直なところ、私が本当に気にかけているのは、スムーズかつ効率的に実行されるプログラムを作成することだけです。より効率的で簡単に構築できる設計は何だと思いますか? 私はただ遊んでいるだけなので、私の感覚が教えてくれる以外に、効率的で強力なクライアント/サーバー プログラムを構築した経験はありません。

4

2 に答える 2

5

かなり前に、TCP/IP のチャット モジュールであるソケットを備えたソフトウェアを作成しました。

各クライアントの最初は、ReaderThread と WriterThread の 2 つのスレッドでした。クライアントが切断されるため、それだけでは十分ではありませんでした。リーダーはサーバー側で切断を検出できず、ライターはメッセージがある場合にのみ検出できなかったため、InactivityChecker スレッドも作成する必要がありました。3 スレッド/クライアントはリソースを少し無駄にしますが、最大 5000 の同時クライアントに対応できます!! -コンテキスト切り替えでプロセッサを消費します! また、開いている最大ポート数にも注意する必要があります。

技術的な理由で 65525/2 を超えるクライアントを「同時に」許可したい場合は、非同期の方法しかありません。

于 2012-12-27T05:22:08.017 に答える
2

あなたはチャットプログラムを書いていますね。この場合、送信および受信されるデータの量は非常に少ないため、効率を気にする必要はありません。プログラミングしやすい方法で行ってください。UI スレッドでデータを直接送信し (書き込みレイテンシが大きくならないようにする必要があります)、別のスレッドでデータを読み取り、受信したデータをよく知られた方法を使用して UI スレッドに送信することを選択しました。どちらの方向でも、単純なブロッキング ソケットを使用するのが最も簡単な方法です。

于 2012-12-27T05:36:46.113 に答える