SocketChannel read()行为 - 简短读取

时间:2011-11-20 14:54:26

标签: java nio java-7

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):

  

此方法返回的套接字通道(如果有)将在   阻止模式,无论此通道的阻塞模式如何。

SocketChannel的write(ByteBuffer buffer)阻止了吗?我怎么测试呢?

感谢您的时间!

1 个答案:

答案 0 :(得分:3)

阻止模式意味着它会阻塞,直到收到任何数据。它不必是一个完整的缓冲区。

如果你想确保收到一整套缓冲的数据,你应该循环read(),直到你填满你的缓冲区。