在Netty4中,为什么在OutboundHandler中同时读取和写入

在Netty4中,为什么在OutboundHandler中同时读取和写入,netty,Netty,我在Netty4中有一个问题,I/O事件由ChannelInboundHandler或ChannelOutboundHandler处理 第一个问题是为什么在ChannelOutboundHandler中都使用读写方法 为什么要在fireChannelReadComplete()中触发read()方法?设计理念是什么 @覆盖 公共通道管道fireChannelReadComplete(){ head.fireChannelReadComplete(); if(channel.config().is

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

  • 第一个问题是为什么在
    ChannelOutboundHandler
    中都使用读写方法
  • 为什么要在
    fireChannelReadComplete()
    中触发
    read()
    方法?设计理念是什么
  • @覆盖
    公共通道管道fireChannelReadComplete(){
    head.fireChannelReadComplete();
    if(channel.config().isAutoRead()){
    read();
    }
    归还这个;
    }
    
    入站处理程序应该处理入站事件。事件由外部刺激触发,例如从插座接收的数据

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

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

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

  • Netty在连接套接字时触发入站事件
    channelActive
    ,然后向其自身发出
    read()
    请求(请参阅
    DefaultChannelPipeline.fireChannelActive()
  • Netty响应
    read()
    请求从套接字读取一些内容
  • 如果读取了某些内容,Netty将触发
    channelRead()
  • 如果没有剩余内容可读,Netty将触发
    channelReadComplete()
  • Netty发出另一个
    read()
    请求以继续从套接字读取

  • 如果禁用了
    autoRead
    ,则必须手动发出
    read()
    请求。有时关闭
    自动读取
    会很有用。例如,您可能希望通过将接收到的数据保存在内核空间中来实现背压机制。

    这种推理不具有说服力。入站和出站的定义通常基于数据流的方向,而不是基于谁呼叫谁的方向。在我看来,这似乎是一个糟糕的设计,为什么你会要求通道出站处理程序读取?完全违反直觉/也称为糟糕的设计