I have a confusion on the onWrite method of Java NIO, when the selector is ready to write should I:
1: Register/Change a OP_Write
2: If Write returns 0 what should I do?
3: After writing should I Register or Change ops?
The channel is set to Non-Blocking
....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);
}
I'm trying to accomplish the lowest latency possible. And the channel will not echo back, it will just read or write.
when the selector is ready to write should I:
1: Register/Change a OP_Write
It's already registered. That doesn't make sense.
2: If Write returns 0 what should I do?
Register OP_WRITE.
3: After writing should I Register or Change ops?
If it doesn't return zero, deregister OP_WRITE.
The channel is set to Non-Blocking
Of course, otherwise you couldn't register anything.
Basically you have the entire question back to front. You should only register OP_WRITE in case (2). Not all the time. Just write whenever you have something to write, and then look for case 2. Then, when OP_WRITE fires, write and look for case 3.