【问题标题】:Java.NIO on Write confusionJava.NIO 关于写混乱
【发布时间】:2015-02-02 10:08:15
【问题描述】:

我对java nio的刻板方法有混乱

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】:

    when the selector is ready to write should I:

    1:注册/更改 OP_Write

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

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

    注册 OP_WRITE。

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

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

    频道设置为非阻塞

    当然,否则你什么都注册不了。

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

    【讨论】:

    • 还有一个疑问,在循环内注销和注册?
    • 其中许多是错误的,或者过于复杂,有不必要的注册/注销队列,或者不知道取消密钥和关闭通道之间的区别,或者两者都做,或者认为你可以'在 OP_WRITE 触发之前不要写任何东西。 (2)靠近普通写代码,在select循环里面或者外面,看你什么时候需要写; (3) 在选择循环内,在从零长度写入恢复的写入代码中..
    猜你喜欢
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多