文件通道读取/添加错误数据

时间:2014-11-17 20:20:31

标签: java udp bytebuffer datagram filechannel

我正在使用带字节缓冲区的文件通道来通过网络发送数据包。我的问题是,当filechannel读取最后几个字节时,它会追加前一个字节读取的最后一位数据,即使我在写入后清除字节缓冲区。

例如,

字节缓冲区大小= 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
}

1 个答案:

答案 0 :(得分:3)

  1. 以这种方式使用DatagramChannel实际上永远不会起作用。您只是以任何顺序发送文件的块,这些块可能会或可能不会到达,或者到达两次或更多次。使用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() 1}}清空缓冲区。

  3. 如果不是DatagramChannel,则应使用远大于512的缓冲区,例如8192.