Netty中的ChannelHandler有inbound handler,处理接收数据的过程;有outbound handler,处理发数据的过程。当然,也有的handler既处理接收的数据 ,也处理发送的数据。
每个channel对应一个ChannelPipeline。handler被添加到ChannelPipeline中,处理channel的事件。
为了直观地理解,借用Netty官网上ChannelPipeline接口描述部分的一张图https://netty.io/4.1/api/index.html:
处理channel接收数据的过程,一般顺序是:
- 切分成完整的消息,例如DelimiterBasedFrameDecoder(基于分隔符切分)、FixedLengthFrameDecoder(基于固定长度切分)、LengthFieldBasedFrameDecoder(基于长度字段及长度字段指明的长度切分)。
- 解码,例如StringDecoder,将字节数据解码为字符串
- 处理具体业务逻辑的handler
处理channel发送数据的过程,一般顺序是:
- 处理具体业务逻辑的handler。
- 编码,例如StringEncoder,将字符串编码为字节
所以向ChannelPipeline增加handler的时候,一般添加顺序是:
- 记录日志的handler,例如LoggingHandler(这个既是inbound handler,也是outbound handler)
- 切分完整的消息的handler
- 解码handler、编码handler
- 处理具体业务逻辑的handler