小编典典

SocketChannel read()行为-短读

java

ServerSocketChannel使用这种方式:

ServerSocketChannel srv = ServerSocketChannel.open();
srv.socket().bind(new java.net.InetSocketAddress(8112));
SocketChannel client = srv.accept();

接收到连接后,将通过以下方式读取数据:

ByteBuffer data = ByteBuffer.allocate(2000);
data.order(ByteOrder.LITTLE_ENDIAN);
client.read(data);
logger.debug("Position: {} bytes read!", data.position());

它打印:

位置:读取16个字节!

为什么直到填充缓冲区后SocketChannel才阻塞?
ServerSocketChannel.accept()API(Java 7):

此方法返回的套接字通道(如果有)将处于阻塞模式,而与该通道的阻塞模式无关。

write(ByteBuffer buffer)SocketChannel的是否阻塞?我该如何测试呢?

感谢您的时间!


阅读 287

收藏
2020-11-30

共1个答案

小编典典

阻止模式意味着它将一直阻止,直到接收到 任何 数据为止。它不必是整个缓冲区都已满。

如果要确保已收到整个缓冲区的数据,则应read()循环执行,直到填满缓冲区。

2020-11-30