(二)Netty中的Channel和ChannelPipeline的运行流程和底层原理

(1)Netty中的ChannelPipeline和Channel分别在Netty中起到什么作用

首先你需要知道在BIO中是面向字节流或者字符流进行传输的,而且BIO中的数据传输还是单向的

而在NIO中传输数据的时候是面向块的效率比较高,而且还是双向的传输,并且是面向channel通道进行的

最后在Netty中的是面向管道的,其实就是包装之后的NIO,一个 Channel 包含了一个 ChannelPipeline, 而 ChannelPipeline 中又维护了一个由 ChannelHandlerContext 组成的双向链表. 这个链表的头是 HeadContext, 链表的尾是 TailContext, 并且每个 ChannelHandlerContext 中又关联着一个 ChannelHandler.
(二)Netty中的Channel和ChannelPipeline的运行流程和底层原理
(二)Netty中的Channel和ChannelPipeline的运行流程和底层原理

(2)看完上面的图和解释,你大概也就差不多基本知道了Netty中channel的内部大体的结构了。

先分别来说一下他们几个核心的名次都是干嘛的吧

1. 先来说一下Channel接口

  • 其实我认为这个Channel就是一个大的通道(就想一个地下通道,这个地下通道都是由一个一个的管道来进行通信或者说运输的),而里面的管道其实就是ChannelPipeline了。

2. 然后说一下ChannelPipeline接口:

  • ChannelPipeline其实里面是又很多个ChannelHandler来组成的,以第一个ChannelHandler作为入站的头部,出站作为尾部,其每一个节点都是一个ChannelHandler。
  • 而且在ChannelPipeline中它可以删除和添加任意一个ChannelHandler,而且可以访问ChannelHandler。
  • ChannelPipeline 保存了与 Channel 相关联的 ChannelHandler
    (二)Netty中的Channel和ChannelPipeline的运行流程和底层原理

3.再来说一下ChannelHandler接口吧:

  • 他是都是通过它的 EventLoop(I/O 线程)来处理传递给它的事件的。所以至关重要的是不要阻塞这个线程,因为这会对整体的 I/O 处理产生负面的影响

4.然后是ChannelHandlerContext接口:

  • 你得知道ChannelHandlerContext它其实是代表了ChannelHandler和ChannelPipeline之间的关联,每当有ChannelHandler添加到ChannelPipeline中时,都会创建一个ChannelHandlerContext。
  • 一个 ChannelHandler 可以从属于多个 ChannelPipeline,所以它也可以绑定到多个 ChannelHandlerContext 实例。对于这种用法指在多个ChannelPipeline *享同一个 ChannelHandler,对应的 ChannelHandler 必须要使@Sharable 注解标注;否则,试图将它添加到多个 ChannelPipeline 时将会触发异常(高级用法)

这个就是ChannelPipeline的内部流程:里面的每一个Handler其实都是一个ChannelHandler对象,也就是实际来干正事的对象
(二)Netty中的Channel和ChannelPipeline的运行流程和底层原理

这是他们几个之间串起来的关系:
(二)Netty中的Channel和ChannelPipeline的运行流程和底层原理