ChannelPipeline不是单独存在,它肯定会和Channel、ChannelHandler、ChannelHandlerContext关联在一起。
一、ChannelHandler
ChannelHandler下主要是两个子接口:
- ChannelInboundHandler(入站): 处理输入数据和Channel状态类型改变。
- 适配器:ChannelInboundHandlerAdapter(适配器设计模式)
- 常用的 SimpleChannelInboundHandler
- ChannelOutboundHandler(出站)::处理输出数据
- 适配器:ChannelOutboundHandlerAdapter
每一个Handler都一定会处理出站或者入站(可能两者都处理数据),例如对于入站的Handler可能会继承SimpleChannelInboundHandler或者hannelInboundHandlerAdapter,而SimpleChannelInboundHandler又是继承于ChannelInboundHandlerAdapter,最大的区别在于SimpleChannelInboundHandler会对没有外界引用的资源进行一定的清理,并且入站的消息可以通过泛型来规定。
这里为什么有适配器模式呢?
我们在写自定义Handler时候,很少会直接实现上面两个接口,因为接口中有很多默认方法需要实现,所以这里就采用了设配器模式,ChannelInboundHandlerAdapter和ChannelInboundHandlerAdapter就是设配器模式的产物,让它去实现上面接口,实现它所有方法。那么你自己写自定义Handler时,只要继承它,就无须重写上面接口的所有方法了。
Channel 生命周期(执行顺序也是从上倒下)
- hannelRegistered: channel注册到一个EventLoop。
- channelActive: 变为活跃状态(连接到了远程主机),可以接受和发送数据
- channelInactive: channel处于非活跃状态,没有连接到远程主机
- channelUnregistered: channel已经创建,但是未注册到一个EventLoop里面,也就是没有和Selector绑定