我对java nio的刻板方法有困惑
1:注册/修改一个OP_Write
2:如果Write返回0怎么办?
3:写完是注册还是改ops?
channel 设置为非阻塞
....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);
}
我正在努力实现尽可能低的延迟。 channel 不会回显,它只会读取或写入。
最佳答案
when the selector is ready to write should I:
1: Register/Change a OP_Write
它已经注册了。这没有意义。
2: If Write returns 0 what should I do?
注册 OP_WRITE。
3: After writing should I Register or Change ops?
如果它不返回零,取消注册 OP_WRITE。
The channel is set to Non-Blocking
当然可以,否则你不能注册任何东西。
基本上,您将整个问题从头到尾。您应该仅在情况 (2) 中注册 OP_WRITE。不是所有的时间。只要你有东西要写,就写,然后寻找案例 2。然后,当 OP_WRITE 触发时,写并寻找案例 3。
关于Java.NIO 写混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28275202/