Java.NIO 写混淆

标签 java nio

我对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/

相关文章:

java - Netty:绑定(bind)不匹配

java - 项目构建类不包括外部项目导入

java - 通过反射获取给定类的可访问方法列表

java - 为什么 Spring Data Neo4j 在节点上创建下划线前缀标签?

java - Android 始终运行 Activity

java - 如何使用 ant 脚本复制属性文件中定义的文件名

android - Netty 在 android-x86 上抛出 java.nio.channels.ClosedSelectorException

java - tcp 服务器 : why adding delay increases ability to service clients? 的异常行为

java - Netty 4.0 - 关闭无效输入的 channel

java - 使用 Java NIO 直接访问 Windows 磁盘