Java.NIO写的混乱

时间:2015-02-02 10:08:15

标签: java nio

我对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);
}   

我正在努力实现可能的最低延迟。并且通道不会回显,它只会读或写。

1 个答案:

答案 0 :(得分:3)

  

当选择器准备好写时我应该:

     

1:注册/更改OP_Write

它已经注册了。这没有意义。

  

2:如果Write返回0我该怎么办?

注册OP_WRITE。

  

3:写完后我应该注册还是改变操作?

如果它没有返回零,则取消注册OP_WRITE。

  

频道设置为非阻止

当然,否则你无法注册任何东西。

基本上你把整个问题都放在了前面。在情况(2)中,您应注册OP_WRITE。不是所有的时间。只要你有写东西就写,然后查找案例2. 然后,当OP_WRITE触发时,写下并查找案例3.