在Netty4中,为什么要在OutboundHandler中读写

 豆伊一 发布于 2023-01-18 15:09

我在Netty4中有一个问题,I/O事件由a ChannelInboundHandler或a 处理ChannelOutboundHandler

    第一个问题是为什么读写方法都在ChannelOutboundHandler

    为什么触发read()方法在fireChannelReadComplete()?什么是设计理念?

@Override
public ChannelPipeline fireChannelReadComplete() {
    head.fireChannelReadComplete();
    if (channel.config().isAutoRead()) {
        read();
    }
    return this;
}

trustin.. 7

入站处理程序应该处理入站事件.事件由外部刺激触发,例如从套接字接收的数据.

出站处理程序应该拦截您的应用程序发出的操作.

Re:Q1)read()是一个可以发出的操作,告诉Netty继续从套接字读取入站数据,这就是它在出站处理程序中的原因.

Re:Q2)您通常不会发出read()操作,因为如果将autoRead属性设置为,Netty会自动为您执行此操作true.autoRead打开时的典型流量:

    channelActive连接套接字时,Netty触发入站事件,然后read()向自己发出请求(请参阅DefaultChannelPipeline.fireChannelActive())

    Netty从套接字中读取内容以响应read()请求.

    如果读了一些东西,Netty会触发channelRead().

    如果没有什么可读的,Netty会触发 channelReadComplete()

    Netty发出另一个read()继续从套接字读取的请求.

如果autoRead已关闭,则必须read()手动发出请求.关闭autoRead时有时很有用.例如,您可能希望通过将接收的数据保留在内核空间中来实现背压机制.

1 个回答
  • 入站处理程序应该处理入站事件.事件由外部刺激触发,例如从套接字接收的数据.

    出站处理程序应该拦截您的应用程序发出的操作.

    Re:Q1)read()是一个可以发出的操作,告诉Netty继续从套接字读取入站数据,这就是它在出站处理程序中的原因.

    Re:Q2)您通常不会发出read()操作,因为如果将autoRead属性设置为,Netty会自动为您执行此操作true.autoRead打开时的典型流量:

      channelActive连接套接字时,Netty触发入站事件,然后read()向自己发出请求(请参阅DefaultChannelPipeline.fireChannelActive())

      Netty从套接字中读取内容以响应read()请求.

      如果读了一些东西,Netty会触发channelRead().

      如果没有什么可读的,Netty会触发 channelReadComplete()

      Netty发出另一个read()继续从套接字读取的请求.

    如果autoRead已关闭,则必须read()手动发出请求.关闭autoRead时有时很有用.例如,您可能希望通过将接收的数据保留在内核空间中来实现背压机制.

    2023-01-18 15:11 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有