0

SelectionKey.OP_READセレクターとselector.select()呼び出しを使用してネットワークソケットからデータを読み取る非ブロッキングクライアントを作成しています。読み取り部分は次のように処理されます。

if (selectionKey.isReadable()) {
    int len = inChannel.read(buf);
    System.out.println(len);
    . . .
}

私が見ている問題は、ダウンロードが進むにつれて読み取りサイズ(len)が徐々に縮退していることです。

1290
1290
1290
480
318
28
28
28
28
28
28
28
28
28
28
28
28
28

なぜこれがなぜであり、それを改善する方法を誰かが知っていますか?もちろん、そのまま動作しますが、CPUのオーバーヘッドを減らす必要があるため、小さなチャンクではなく大きなチャンクを処理するのが最適です。小さなスリープ(20ms)を追加すると役立ちますが、数千のストリームを同時に処理する必要があるため、スケーラビリティが明らかに制限されます。

4

1 に答える 1

0

私自身の質問に答えるつもりです...

気にしないでください; バッファを正しく使用していませんでした。compact()バッファから読み取った後、呼び出しを忘れました。

if (selectionKey.isReadable()) {
    int len = inChannel.read(buf);
    System.out.println(len);
    . . .
    buf.flip();
    // ... read from buf ...
    buf.compact();
}

どうやら、バッファは循環的ではありません。バッファが空であっても、次に使用する前に位置と制限をリセットする必要があります。

于 2012-07-11T08:51:26.720 に答える