selectionKey.isReadable()返回false(应该吗?)
当然,直到有要读取的数据或流结束为止。
在发送初始数据包之前,操作更改为:
_selectionKey.interestOps(_selectionKey.interestOps() |SelectionKey.OP_WRITE)
馊主意。
OP_WRITE几乎总是准备就绪,即套接字发送缓冲区已满时除外,因此您只会导致
Selector.select()方法无意识地旋转。
要写入通道时,只需写入即可。在经典循环中执行以下操作:
while (buffer.position() > 0){ buffer.flip(); int count = channel.write(buffer); buffer.compact(); if (count == 0) { // see below ... }}如果
count是零,你应该 再 注册
OP_WRITE,打破循环出来,并回到
Selector循环。如果您没有退出此循环,请 注销
OP_WRITE.
请注意,这意味着每个通道都有一个写缓冲区。由于类似的原因(
read()返回零),每个通道还需要一个读取缓冲区。反过来,这意味着一个包含两个对象的通道“会话”对象,并且可能是通道选择键的附件。



