我有一个配置为阻塞的socketChannel,但是当从此套接字读取5K的字节缓冲区时,有时会得到不完整的缓冲区。

    ByteBuffer messageBody = ByteBuffer.allocate(5*1024);
    messageBody.mark();
    messageBody.order(ByteOrder.BIG_ENDIAN);
    int msgByteCount = channel.read(messageBody);


有时,messageBody不会完全填充,并且channel.read()不会返回-1或异常,而是实际读取的字节数(小于5k)。

有没有人遇到过类似的问题?

最佳答案

这就是读取的方式。 SocketChannel文档说:


  读取操作可能不会填满缓冲区,实际上,它可能根本不会读取任何字节。 [...]但是,可以保证,如果通道处于阻塞模式,并且缓冲区中至少剩余一个字节,则此方法将阻塞,直到读取至少一个字节为止。

07-27 15:14