0

Java NIO は初めてです。

サーバー(異なるIP /ポート)をループで繰り返し照会するJavaプログラムがあります。しかし、ループではなく一度にすべてのパケットを送信し、受信したデータを応答パケットに保存したいと考えています。

クエリは 1 つの応答パケットのみで構成され、それ以上の通信は必要ありません。

これはそれを行う方法ですか - > データグラム Channel を作成し、 .send() を介してすべてのパケットを送信し、パケットをリッスンし、新しいスレッドを開始してパケットデータを処理および保存します。

サーバーの数は 400 を超える可能性があります。スレッド数を 400 にするか、データグラム チャネルを 400 にするか、どちらが良いですか??? また、 NIO の代わりに async パッケージを使用する必要があります。

Nettyなどで簡単になりますか?

4

2 に答える 2

0

私は NIO についてアドバイスできるほど詳しくはありませんが、返信の処理に関しては、スレッド プールとチャネル プールをより適切に使用してください。

編集 - 詳細説明

サーバーが応答するポートをリッスンするスレッドは1 つだけにする必要があります。応答を受信したら、「ハンドル タスク」をタスク キューに送信します。次に利用可能なスレッドがそのタスクをプルして処理します。

したがって、使用可能なスレッドよりも多くの応答 (=タスク) がある場合、タスクはキューで待機します。Java には、 java.util.concurrentパッケージの下で優れたスレッド プール サポートがあります。もちろん、これらの制限は構成可能です。

基本的に、リスナー スレッドは、ハンドル タスクを作成してキューに入れるという最小限の操作を実行しています。その短い期間に返信がないことを恐れている場合は、より多くのリスナースレッドを構成する必要があります...しかし、そこに本当の懸念があるとは思えません。

于 2012-06-14T14:34:56.793 に答える
0

UDP を使用する場合は、サーバーごとに 1 つのスレッドと、それらすべてに対して 1 つのポートを使用できます。さまざまなメッセージ タイプにいくつかのポートを使用したい場合があります。

マルチキャストとポートを 1 つだけ使用する場合、すべてのリスナーは、任意のアプリケーションからその IP とポートへのすべてのパケットを受信します。

于 2012-06-14T14:45:39.777 に答える