本章包括:
![](https://img-blog.csdn.net/20140630093213250?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGluZ3J1a3Vu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
1、ChannelPipeline
2、ChannelHandlerContext
3、Channelhandler
4、Inbound与Outbound
ChannelPipeline
ChannelPipeline是一系列的ChannelHandler实例,用来处理或拦截channel的进站/出站操作。它提供了拦截器模式的高级形式,提供给用户一个强大的工具用以控制:
-如何处理一个事件;
-ChannelPipeline中的ChannelHandlers如何彼此进行交互;
每一个新建的Channel,都有一个新的ChannelPipeline被创建并与之关联。一旦关联上,这种关联就是永久的。
如何修改ChannelPipeline:
addFirst()、addBefore()、addAfter()、addLast()、remove()、replace()等;
*注意:不要在ChannelHandler中阻塞线程,这将影响到整个IO的处理。
*在Netty-4.0.19Final中,ChannelHandler不再继承自ChannelInboundInvoker和ChannelOutboundInvoker。
ChannelPipeline提供了很多方法,用来唤醒其中的ChannelHandlers并处理不同的事件(不同方法唤醒的是不同bound类型的Channelhandler)。
ChannelHandlerContext
每当一个ChannelHandler被添加到ChannelPipeline,一个新的ChannelHandlerContext被创建和分配。ChannelHandlerContext使ChannelHandler能够与其它ChannelHandler实现交互。
对被添加的ChannelHandler来说,ChannelHandlerContext是不变的,因此缓存它是安全的。
ChannelHandlerContext中的很多方法与Channel、ChannelPipeline中的方法相同,区别是:
如果通过ChannelHandlerContext来调用,那么是从当前位置开始,唤醒ChannelPipeline中最近能够处理该事件的ChannelHanlder;而通过Channel或ChannelPipeline来调用,则会流经整个ChannelPipeline(是从头开始还是从尾开始依赖与事件的属性:如果是入站事件,那么它会从ChannelPipeline的头部开始;如果是出站事件,那么会从尾部开始)。
1、ChannelPipeline绑定到的Channel;
2、绑定到Channel的ChannelPipeline并持有被添加的ChannelHandler实例;
3、作为ChannelPipeline一部分的ChannelHandler;
4、当向ChannelPipeline中添加ChannelHandler时创建的ChannelHandlerContext;
1、事件被传递给ChannelPipeline中的第一个ChannelHandler;
2、ChannelHandler使用关联的ChannelHandlerContext将事件传递给ChannelPipeline中的下一个ChannelHandler;
3、
ChannelHandler使用关联的ChannelHandlerContext将事件传递给ChannelPipeline中的下一个ChannelHandler;
1、使用ChannelHandlerContext,事件被传递给指定的ChannelHandler;
2、事件被传递;
3、没有更多的ChannelHandler,事件被移出ChannelPipeline;
修改ChannelPipeline
如果添加了@Sharable注解,那么一个ChannelHandler实例可以被添加到多个ChannelPipeline,这意味着一个ChannelHandler实例可以有多于一个的ChannelHandlerContext,因此这个实例可以被不同的ChannelHandlerContext调用。
注意:如果一个ChannelHandler添加了@Sharable注解,那么要保证在不同线程中或不同的channel(连接)中并发调用是安全的(无状态)。
状态模型
Channel的生命周期:
channelUnregistered > channelRegistered > channelActive > channelInactive
ChannelHandlers和它们的类型
Inbound Handler - 处理入站(接收数据)和所有的状态变化
Outbound Handler - 处理出站(发送数据)并允许拦截所有的操作
ChannelHandler接口
所有不同类型handler的父接口,它提供了在ChannelHandler被添加到ChannelPipeline或从中移除后调用的生命周期操作:
handlerAdded()、handlerRemoved()、exceptionCaught()等;
Netty提供了ChannelHandler的默认实现:ChannelHandlerAdapter。
Inbound handlers
ChannelInboundHandler(自带默认实现类:ChannelInboundHandlerAdapter):
channelRegistered()、channelUnregistered()、channelActive()、channelInactive()、channelReadComplete()、channelRead()、userEventTriggered()等;
注意:重写channelRead(...)方法要记得释放资源,否则可能造成内存泄漏。
SimpleChannelInboundHandler已经处理了资源释放,因此不需要关心,但是记得不能存储它的引用用以稍后访问资源。
Outbound handlers
ChannnelOutboundHandler(自带默认实现类:ChannelOutboundHandlerAdapter):
bind()、connect()、disconnect()、close()、deregister()、read()、flush()、write()等;