不惑之年的硬件牛人转到软件自学之netty框架(三)ChannleHandler和ChannelPipeline
由于近期开发一个中型的物联项目,带着十来个兄弟从底层硬件到无线局域通信到通用网关到netty高可用框架到spring cloud的后台开发到移动端APP开发到WEB前端的开发整体框架的搭建,虽然很辛苦,但我一直在给兄弟们说我们要三年内在物联行业占有一席之地,期待项目的成功。就因为这样,我写出了这个netty自学框架,虽然也是开始学习,我想通过项目的历练肯定对大家都有用,加油!
今天是:2018年5月29日 主题:ChannleHandler和ChannelPipeline
一、Channel的生命周期状态
1、ChannelUnregistered:Channel已经被创建,但还未注册到EventLoop
2、ChannelRegistered:Channel已经被注册到了EventLoop
3、ChannelActive:Channel处于活动状态(已经连接到它的远程节点)
4、ChannelInactive:Channel没有连接到远程节点
二、ChannelHandler的生命周期
1、handlerAdded:当把ChannelHandler添加到ChannelPipeline中时被调用
2、handlerRemoved:当从ChannelPipeline中移除ChannelHandler时被调用
3、exceptionCaught:当处理过程中在ChannelPipeline中有错误产生时被调用
三、Netty定义了下面两个重要的ChannelHandler子接口:
1、ChannelInboundHandler----处理入站数据以及各种状态变化,其方法如下:
2、ChannelOutboundHandler---处理出站数据并且允许拦截所有的操作,其方法如下:
四、ChannelPipeline接口
ChannelPipeline是一个拦截流经Channel的入站和出站事件的ChannelHandler实例链。
1、修改ChannelPipeline:ChannelHandler可以通过添加、删除或者替换其他的ChannelHandler来实时地修改ChannelPipeline的布局。ChannelHandler的用于修改ChannelPipeline的方法如下:
2、ChannelPipeline的用于访问ChannelHandler的操作
3、ChannelPipeline的入站操作方法
4、ChannelPipeline的出站操作
5、总结一下:
ChannelPipeline保存了与Channel想关联的ChannelHandler;
ChannelPipeline可以根据需要,通过添加或者删除ChannelHandler来动态地修改;
ChannelPipeline有着丰富的API用以被调用,以响应入站和出站事件。
五、ChannelHandlerContext接口
1、ChannelHandlerContext代表了ChannelHandler和ChannelPipeline之间的关联,每当有ChannelHandler添加到ChannelPipeline中时,都会创建ChannelHandlerContext。ChannelHandlerContext的主要功能是管理它所关联的ChannelHandler和在同一个ChannelPipeline中的其他ChannelHandler之间的交互。
2、ChannelHandlerContext的API
3、当使用ChannelHandlerContext的API的时候,请牢记以下两点:
ChannelHandlerContext和ChannelHandler之间的关联(绑定)是永远不会改变的,所以缓存对它的应用是安全的;
ChannelHandlerContext的方法将产生更短的事件流,应该尽可能地利用这个特性来获得最大的性能。
4、从ChannelHandlerContext访问Channel
ChannelHandlerContext ctx = . .;
Channel channel = ctx.channel(); //获取到与ChannelHandlerContext相关联的Channel的引用
channel.write(Unpooled.copiedBuffer("Netty in Action",CharsetUitl.UTF_8)); //通过Channel写入缓冲区
5、通过ChannelHandlerContext访问ChannelPipeline
ChannelHandlerContext ctx = . .;
ChannelPipeline pipeline = ctx.pipeline(); //获取到与ChannelHandlerContext相关联的ChannelPipeline的引用
pipeline.write(Unpooled.copiedBuffer("Netty in Action",CharsetUitl.UTF_8)); //通过ChannelPipeline写入缓冲区