3

ソケット接続からサーバーへの非同期メッセージ (さまざまなサイズ) を受信して​​処理するための効率的なソリューションを探しています。これは十分な量の帯域幅です (おそらく 250 kB/秒の定常状態で、最大 1 MB/秒の短いバーストを持つことができます)。現在、私は DataInputStream を使用していますが、忙しい瞬間に切断されます (キューのバックログが大きくなりすぎると、サーバーはクライアントを切断します)。

BufferedInputStream がより適切に機能するかどうか、誰でも確認できますか? バイトごとではなく、一度にデータのチャンクを取得することを読んだので、OS 呼び出しが少なくなります。

ありがとう!

4

2 に答える 2

2

一度にチャンクを取得し、OS 呼び出しが少なくなる可能性がありますが、バックログを処理するのに十分な速さで read を呼び出していない場合、これは役に立ちません。プリフェッチしたチャンクを完全に読み取るまで、次のチャンクを読み取りません。

おそらく最善の方法は、常に InputStream の先頭に留まり (読み取るものがある場合は常に読み取る)、他の処理を後で行うか、別の (優先度の低い) スレッドで行うことです。

于 2012-06-15T19:58:04.547 に答える
1

私は専門家ではありませんが、BufferedInputStreamはXバイトの大きさのバッファーを使用するため、実際には一度にチャンクを読み取ることを知っています。これは本質的に、あなたが言ったようにシステムコールを使用させるのではなく、ソケットを介してデータを読み取るための抽象化です。切断の問題に役立つ場合があります。いくつかの点を繰り返して申し訳ありません。基本的に、バッファストリームを使用することをお勧めします。それはより制御されており、いくつかのグーグル検索はあなたにはるかに良い洞察を与えるでしょう。

于 2012-06-15T20:00:16.213 に答える