3

ネットワーク経由でパケットを送信するために、バイト バッファーを備えたファイル チャネルを使用しています。私の問題は、ファイルチャネルが最後の数バイトを読み取るときに、書き込み後にバイトバッファーをクリアしているにもかかわらず、読み取った前のバイトから最後のビットのデータを追加することです。

例えば、

Byte Buffer size = 512 最後の反復で、送信する残りのバイトは 372 です。最後の 372 を読み取りますが、その末尾に別の 140 バイト (512-372) を追加し、最後の 140 バイトが前の 512 バイトが送信されました。

私のコードは次のとおりです。

ByteBuffer bBuffer = ByteBuffer.allocate(512);

while (fChannel.read(bBuffer) > 0) {

    bBuffer.flip();
    datagramChannel.write(bBuffer);
    bBuffer.clear();

    //omitted code
}
4

1 に答える 1

3
  1. この方法を使用しても、DatagramChannel実際には機能しません。ファイルのチャンクを送信しているだけで、到着する場合と到着しない場合、または 2 回以上、任意の順序で到着する場合があります。TCP を使用します。

  2. 魔法のように機能したとしても、「省略されたコード」または受信コードにさらにバグがあるのではないかと私は疑っています。

    while (fChannel.read(bBuffer) > 0) {
    
        bBuffer.flip();
        datagramChannel.write(bBuffer);
        bBuffer.clear();
    
        //omitted code
    }
    

    Java のチャネル間のコピー ループの正しいバージョンは次のとおりです。

    while (fChannel.read(buffer) > 0 || buffer.position() > 0) {    
        buffer.flip();
        datagramChannel.write(bBuffer);
        buffer.compact();
    }
    

    バッファにまだ何かがあるうちに書き込みを続行する必要があることに注意してください ( buffer.position() > 0) 。バッファが空になったとcompact()想定clear()しないようにする必要があります。write()

  3. そうでない場合は、DatagramChannel8192 など、512 よりもはるかに大きなバッファを使用する必要があります。

于 2014-11-17T22:12:32.857 に答える