Java.NIO写的混乱

问题描述 投票:1回答:1

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

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

java nio
1个回答
3
投票

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

1:注册/更改OP_Write

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

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

注册OP_WRITE。

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

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

频道设置为非阻止

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

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

© www.soinside.com 2019 - 2024. All rights reserved.