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

时间:2014-03-12 14:09:23

标签: netty

我在Netty4中有一个问题,I / O事件由ChannelInboundHandlerChannelOutboundHandler

处理
  1. 第一个问题是为什么ChannelOutboundHandler中的读写方法?
  2. 为什么在read()中触发fireChannelReadComplete()方法?什么是设计理念?
  3. @Override
    public ChannelPipeline fireChannelReadComplete() {
        head.fireChannelReadComplete();
        if (channel.config().isAutoRead()) {
            read();
        }
        return this;
    }
    

1 个答案:

答案 0 :(得分:7)

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

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

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

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

  1. Netty在连接套接字时触发入站事件channelActive,然后向自己发出read()个请求(请参阅DefaultChannelPipeline.fireChannelActive()
  2. Netty从套接字中读取内容以响应read()请求。
  3. 如果阅读了某些内容,Netty会触发channelRead()
  4. 如果没有什么可读的,Netty会触发channelReadComplete()
  5. Netty发出另一个read()请求以继续从套接字读取。
  6. 如果autoRead已关闭,您必须手动发出read()请求。关闭autoRead有时会很有用。例如,您可能希望通过将接收的数据保留在内核空间中来实现背压机制。