我有一个配置为阻塞的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文档说:
读取操作可能不会填满缓冲区,实际上,它可能根本不会读取任何字节。 [...]但是,可以保证,如果通道处于阻塞模式,并且缓冲区中至少剩余一个字节,则此方法将阻塞,直到读取至少一个字节为止。