我对Java NIO的onWrite方法感到困惑,当选择器准备写入时我应该:
1:注册/更改OP_Write
2:如果Write返回0我该怎么办?
3:写完后我应该注册还是改变操作?
频道设置为非阻止
....onAccept register OP_READ
public void onWrite()
{
ByteBuffer bb = ByteBuffer.wrap(msg.encode());
while(bb.remaining()!= 0){
int ret = socketChannel.write(bb);
if(ret == 0){
//Should I register or should I change op?
//socketChannel.register(selector, SelectionKey.OP_WRITE, null);
//selectionKey.interestOps(SelectionKey.OP_WRITE);
}
}
//Is it necessary to change op or re-register Read or 0
//socketChannel.register(selector, SelectionKey.OP_READ, null);
//selectionKey.interestOps(SelectionKey.OP_READ);
//selectionKey.interestOps(0);
}
我正在努力实现可能的最低延迟。并且通道不会回显,它只会读或写。
答案 0 :(得分:3)
当选择器准备好写时我应该:
1:注册/更改OP_Write
它已经注册了。这没有意义。
2:如果Write返回0我该怎么办?
注册OP_WRITE。
3:写完后我应该注册还是改变操作?
如果它没有返回零,则取消注册OP_WRITE。
频道设置为非阻止
当然,否则你无法注册任何东西。
基本上你把整个问题都放在了前面。在情况(2)中,您应仅注册OP_WRITE。不是所有的时间。只要你有写东西就写,然后查找案例2. 然后,当OP_WRITE触发时,写下并查找案例3.