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)
阻止了吗?我怎么测试呢?
感谢您的时间!
答案 0 :(得分:3)
阻止模式意味着它会阻塞,直到收到任何数据。它不必是一个完整的缓冲区。
如果你想确保收到一整套缓冲的数据,你应该循环read()
,直到你填满你的缓冲区。