-1
System.out.println(" @ bBuffer = " + bBuffer.capacity());

headerBuffer.rewind();
socketChannel.write(headerBuffer);

int writen = socketChannel.write(bBuffer);
System.out.println(" @ writen = " + writen);

bBufferタイプのオブジェクトであり、それは(画像ファイルです)ByteBufferから来ました。FileChannel.map()クライアントでこの画像ファイルを受け取ったとき、それは完全な画像ではなく、画像の約半分が欠落していました。そこで、いくつかの統計をコンソールに出力して、書き込まれたバイト数を確認しました。出力は次のとおりです。

 @ bBuffer = 319932
 @ writen = 131071

残りのバイトはどうなりましたか? (319923 - 131071) バイトが不足しているようです。

ファイルサイズやバッファ容量に関係なく、written等しい場合もあります。bBuffer.capacity()

4

1 に答える 1

0

あなたのコードは無効な仮定をしています。呼び出しごとに 1 バイト以上を転送する義務はありませんread()write()ループする必要があります。しかし、とにかくあなたはこれを間違っています。そのはず:

while (headerBuffer.position() > 0)
{
    headerBuffer.flip();
    socketChannel.write(headerBuffer);
    headerBuffer.compact();
}

また

headerBuffer.flip();
while (headerBuffer.hasRemaining())
{
    socketChannel.write(headerBuffer);
}
headerBuffer.compact();

が非ブロッキング モードの場合、SocketChannelかなり複雑になりますが、質問ではそれについて言及していません。

また、同じ仮定について受信コードを確認する必要があります。

于 2014-12-10T05:02:55.117 に答える