前言

Netty系列索引:

1.Netty入门(一):ByteBuf

2.Netty入门(二):Channel

在Netty框架中,Channel是其中之一的核心概念,是Netty网络通信的主体,由它负责同对端进行网络通信、注册和数据操作等功能。本文我们来详细地分析 Netty 中的 Channel以及跟Channel相关的其他概念,包括ChannelPipeline、ChannelHandlerContext、ChannelHandler等

上图简述了数据被读取后的处理流程,可以看出channel通过pipeline链接了多个Handler并依次执行,类似职责链模式。

Channel

目前可以把 Channel 看作是传入(入站)或者传出(出站)数据的通道,它可以被打开或者被关闭,连接或者断开连接。

Netty对JDK原生的ServerSocketChannel进行了封装和增强, 相对于原生的JdkChannel, Netty的Channel增加了如下的组件

  • id 标识唯一身份信息
  • 可能存在的parent Channel
  • 管道 pepiline,用于链接handler
  • 用于数据读写的unsafe内部类,实际IO操作都是该类实现的
  • 关联唯一的EventLoop,EventGroup->EventLoop->Channel(后续章节再讲,其实就是类似线程池的东西)

channel生命周期

ChannelUnregistered  Channel 已经被创建,但还未注册到 EventLoop
ChannelRegistered  已经被注册到了 EventLoop
ChannelActive  处于活动状态(已经连接到它的远程节点)。它现在可以接收和发送数据了
ChannelInactive  没有连接到远程节点

ChannelPipeline

ChannelPipeline是ChannelHandler实例对象的链表,用于处理或截获通道的接收和发送数据。它提供了一种高级的截取过滤模式(类似serverlet中的filter功能),让用户可以在ChannelPipeline中完全控制一个事件以及如何处理ChannelHandler与ChannelPipeline的交互。

每个Channel,都会创建一个唯一的ChannelPipeline

ChannelPipeline 可以根据需要,通过添加或者删除 ChannelHandler 来动态地修改(典型应用,动态修改协议等)

ChannelPipeline 有着丰富的 API 用以被调用,以响应入站和出站事件。

ChannelHandlerContext

ChannelHandlerContext类似上下文的概念,代表了 ChannelHandler 和 ChannelPipeline 之间的关联,每当有 ChannelHandler 添加到 ChannelPipeline 中时,都会创建 ChannelHandlerContext。

ChannelHandlerContext 的主要功能是管理它所关联的 ChannelHandler 和在同一个 ChannelPipeline 中的其他 ChannelHandler 之间的交互。

核心功能:

  • ChannelHandlerContext使得ChannelHandler能够和它的ChannelPipeline以及其他的ChannelHandler 交互。
  • ChannelHandler 可以通知其所属的 ChannelPipeline 中的下一个ChannelHandler
  • ChannelHandlerContext 具有丰富的用于处理事件和执行 I/O 操作的 API

ChannelHandler

生命周期:

handlerAdded  当把 ChannelHandler 添加到 ChannelPipeline 中时被调用
handlerRemoved  当从 ChannelPipeline 中移除 ChannelHandler 时被调用
exceptionCaught  当处理过程中在 ChannelPipeline 中有错误产生时被调用

ChannelInboundHandler 的方法

ChannelOutboundHandler 的方法

内存泄漏监控

在使用handler处理ByteBuf时,应正确处理其被引用次数,尤其是调用read和write后,应正确释放其引用。

(注意:SimpleChannelInboundHandler会自动释放引用)

最新文章

  1. struts之动态方法调用使用通配符
  2. mybatis+springMVC新感悟
  3. soapUI快速入门(测试一个登录接口)
  4. winform 打包部署
  5. 【转】ubuntu中的Wine详解
  6. Android使用xml中定义的动画效果
  7. Java的跨平台原理
  8. Spring + Spring MVC + Hibernate
  9. OMCS开发手册(02) -- 多媒体连接器
  10. OD提示 "为了执行系统不支持的动作, OllyICE 在这个被调试的程序中注入了一点代码, 但是经过5秒仍未收到响应..." 解决办法
  11. [笔记]ACM笔记 - 排序小技巧
  12. Yii2之事件
  13. 记录Nginx作为静态资源web服务场景配置
  14. winfrom进程、线程、用户控件
  15. 【转】Windows下selenium+python自动化测试环境搭建
  16. docker-compose编排springcloud微服务
  17. django之Model类
  18. 获取 MySQL 崩溃时的 core file
  19. sencha touch 类的使用
  20. 发票查验---异步处理多条记录---demo代码

热门文章

  1. 使用gitlab自带的ci/cd实现.net core应用程序的部署
  2. Pptx的多路径形状转为WPF的Path
  3. 查看JVM中的线程名
  4. Java:java获取Linux下的路径
  5. linux中如何添加用户并赋予root权限详解
  6. ELK处理Spring Boot 日志,妙!
  7. 一文读懂 .NET 中的高性能队列 Channel
  8. C语言:读TXT 模拟键盘打字输出
  9. vs2013:asp.net网站发布
  10. c语言字符串存储方式