0

何百ものソケット通信を読み取る必要があるアプリケーションがあります。

これらのソケットにサービスを提供するために、スレッド数に上限のあるThreadPoolを使用しています。これにより、ソケットに着信メッセージがない場合、すべてのスレッドがブロックされます。

私は現在、永続的なブロッキングを回避するために100msのsoTimeoutを使用しています。入力の受信を開始すると同時にタイムアウトになる可能性があるため、このアプローチは好きではありません。

とにかくこれに近づくために他にありますか?

ObjectInputStream.isAvailable()でチェックしようとしましたが、ストリームにデータがあるかどうかに関係なく、常に0が返されます。

ストリームにデータがあるかどうかを確認する他の方法が見つかりません。これは理想的です。データがあるかどうかを確認でき、ない場合は次のストリームに進むことができます。

4

2 に答える 2

1

NIOにチャンスを与えることができます。ソケットごとにスレッドを作成する代わりに、SelectorとSocketChannelsを使用してデータを待機します。

セレクタ

SocketChannel

于 2011-07-31T12:45:27.317 に答える
1

これはまさに、NIOフレームワークが解決しようとしている種類の問題です。残念ながら、raw NIOを使用することは、ブロッキングIOを使用するよりも少し難しいです。可能であれば、 Nettyのようなフレームワークを試してみることをお勧めします。これにより、作業が簡単になります。

于 2011-07-31T12:47:39.717 に答える