netty学习(三)ChannelInboundHandler和ChannelOutboundHandler
来源:互联网 发布:国家顶级域名有哪些 编辑:程序博客网 时间:2024/05/18 13:26
从应用程序开发人员的角度来看,Netty的主要组件是ChannelHandler,它充当着所有入站和出站数据的应用程序逻辑的容器。这是可行的,因为ChannelHandler的方法是由网络事件触发的。事实上ChannelHandler可专门用于几乎任何类型的动作,例如将数据从一种格式转换为另外一种格式,或者处理转换过程中所抛出的异常。
ChannelHandler主要由两种组成,ChannelInboundHandler和ChannelOutboundHandler这两种
其中ChannelInboundHandler是进站处理器,当channel进站时,产生一的一系列事件将由ChannelHandler所对应的API处理,当然netty是基于事件异步处理的,是由EventLoop不停地select出事件然后调用ChannelHandler的API,同理ChannelOutboundHandler是出站处理器。
ChannelPipeline为ChannelHandler链提供了容器,并定义了用于在该链上传播入站和出站事件流的API。当Channel被创建时,他会自动的分配到它专属的ChannelPipeline。
ChannelHandller安装到ChannelPipeline中的过程如下所示:
- 一个ChannelInitializer的实现被注册到了ServerBootstrap中;
- 当ChannelInitializer.initChannel()方法被调用时,ChannelInitializer将在ChannelPipeline中安装一组自定义的ChannelHandler;
- ChannelInitializer将它自己从ChannelPipeline中移除
也就是说ChannelPipeline是ChannelHandler的容器,这样使得事件流经ChannelPipeline是ChannelHandler的工作,它们是在应用程序的初始化啊或者引导阶段被安装的。这些对象接受事件,执行它们所实现的处理逻辑,并将数据传递给链中的下一个ChannelHandler。它们的执行顺序是由它们被添加的顺序锁决定的。实际上,被我们称为ChannelPipeline是这些ChannelHandler的编排顺序。
那么入站处理器ChannelInboundHannelHandler和ChannelOutboundHandler有什么区别呢。举一个例子
ChannelPipeline p = ...; p.addLast("1", new InboundHandlerA()); p.addLast("2", new InboundHandlerB()); p.addLast("3", new OutboundHandlerA()); p.addLast("4", new OutboundHandlerB()); p.addLast("5", new InboundOutboundHandlerX());从代码中我们知道ChannelHandler在ChannelPipeline中的编排顺序是从1,2,3,4,5。当入站时是从ChannelPipeline中从头部一次执行的,也就是一次执行1,2,5;
同理当出站时是从ChannelPipeline的尾部像头部的方向一次执行的,也就是一次执行5,4,3;
那么弄清了ChannelInboundHandler和ChannelOutboundHandler的区别后,接下来需要了解什么情况下是出站,什么情况下出站,例如:从一个客户端应用程序的角度看,如果事件的运动方向是客户端到服务端,那么我们称这些时间为出站的,反之则成为入站,同理,从一个服务端的角度看,如果事件的运动方向是服务端到客户端则称为出站,反之为入站。
阅读全文
0 0
- netty学习(三)ChannelInboundHandler和ChannelOutboundHandler
- netty的ChannelInboundHandler接口
- java netty handler之ChannelInboundHander与ChannelOutboundHandler
- Netty学习笔记(三) ChannelPipeline和ChannelHandler
- 《Netty学习》(三)Channel学习
- Netty学习(三)-Netty重要接口讲解
- Netty学习之三
- Netty学习之旅(三)(分隔符和定长解码器)
- 学习 java netty (三) -- Channel
- Netty学习(三)HelloWorld服务器
- Netty学习三:线程模型
- Netty学习三:线程模型
- netty学习(三)----伪异步IO编程
- netty学习(三)——开始传送对象喽!!
- netty源码学习三(channel、channelHandler、channelPipeline)
- Netty学习(三)—Codec编解码基础
- Netty 学习(5) Netty Example--echo
- Netty 学习(8)Netty Example Telnet
- JavaScript学习之路<八>
- JavaScript学习之路<九>
- Java基础
- JavaScript学习之路<十>
- Jquery 中 ajaxSubmit使用讲解
- netty学习(三)ChannelInboundHandler和ChannelOutboundHandler
- JavaScript学习之路<十一> JS面向对象程序设计
- vs+cuda+opencv配置
- 关于导入.xlsx和.xls文件的一点心得
- Opencv在VS中的环境配置
- Java集合---Vector类源码解析
- JavaScript学习之路<十二> JS面向对象程序设计--原型深入
- nfs安装-Not starting NFS kernel daemon: no exports 问题解决
- Spring MVC之excel表格导出