这两个组件主要用来管理数据流以及执行应用程序处理逻辑的组件。

ChannelHandler接口

在开发者的角度来看,ChannelHandler应该是一个最核心的接口,它充当了处理入站和出站数据的应用程序逻辑的容器。它主要由网络事件触发的。ChannelHandler可用于几乎任何类型的动作,例如将数据从一种格式转为另外一种格式。
ChannelHandler有许多不同类型的,它们各自的功能主要取决于它们的超类,Netty以适配器类的形式提供了大量默认的ChannelHandler实现,旨在简化程序处理逻辑的开发,我们在开发的过程中只需要重写特定的想要的方法即可。
常用到的ChannelHandler适配器类:

  1. ChannelHandlerAdapter
  2. ChannelInboundHandlerAdapter
  3. ChannelOutboundHandlerAdapter
  4. ChannelDuplexHandler

    编码器和解码器

    当通过Netty发送或者接收一个消息的时候,就将会发生一次数据转换。入站会被解码,也就是说,从字节转换为另一种格式,通常为一个Java对象,出站则相反。

    抽象类SimpleCHannelInboundHandler

    假如你的应用程序会利用ChannelHandler来接收解码消息,并对该数据进行业务逻辑处理。创建一个这样的ChannelHandler只需要扩展该基类,SimpleCHannelInboundHandler,其中的T就是要处理的消息的Java类型,其中最重要的一个方法是channelRead0(ChannelHandlerContext,T)

    ChannelPipeline接口

    ChannelPipeline为ChannelHandler链提供了容器,并定义了用于在该链上传播入站和出站事件流的API。当Channel被创建时,它会被自动地分配到它专属的ChannelPipeline。
    ChannelHandler安装到ChannelPipeline中的过程如下所示:
  • 一个ChannelInitializer的实现被注册到了ServerBootStrap中
  • 当ChannelInitializer.initChannel()方法被调用时,ChannelInitializer将在ChannelPipeline中安装一组自定义的ChannelHandler
  • ChannelInitializer将它自己从ChannelPipeline中移除

事件流经ChannelPipeline是ChannelHandler的工作,它们是在应用程序的初始化或者引导阶段被安装的。这些对象接收事件、执行它们所实现的处理逻辑,并将数据传递给链中的下一个ChannelHandler,执行顺序按照它们被添加的顺序所决定。
如果一个消息或者任何其他的入站事件被读取,那么它会从ChannelPipeline的头部开始流动,并被传递给第一个ChannelInboundHandler,出站事件则相反。
ChannelPipeline中的ChannelHandler是通过ChannelHandlerContext这个对象参数进行传递的,当ChannelHandler被添加到ChannelPipeline时,它将会被分配一个ChannelHandlerContext,其代表了ChannelHandler和ChannelPipeline之间的绑定
Netty确保数据只会在具有相同定向类型的两个ChannelHandler之间传递,所以不会有一个ChannelPipeline同时拥有入站和出站的ChannelHandler

发送消息的两种方式:

  1. 直接写到Channel中
  2. 写到和ChannelHandler相关联的ChannelHandlerContext对象中

前一种方法导致消息从ChannelPipeline的尾端开始流动,后者导致消息从ChannelPipeline中的下一个ChannelHandler开始流动