Channel和ChannelPipeline以及ChannelHandlerContext

Channel

1.Channel是一组socket或者能够执行i/o操作(读写,连接和绑定)的组件的连接。

channel可以提供:

  • channel目前的状态,比如打开,或者已连接状态。
  • channel的配置参数。
  • channel支持的i/o操作
  • 提供channelpipeline,可以处理所有的i/o事件或者请求。

2.所有的i/o操作都是异步的。这意味着任何的i/o调用都会立即返回,并且并不保证所有请求的i/o操作都会在调用结束时已经完成。

3.Channel的生命周期

  • ChannelUnRegistered:Channel已经被创建,但还未注册到EventLoop
  • ChannelRegister:Channel已经注册到了EventLoop
  • ChannelActive:Channel处于活动状态。它现在可以收发数据了
  • ChannelInactive:Channel没有连接到远程节点。
  • 这些事件将被转发给ChannelPipeline中的ChannelHandler,其可以随后对它们做出响应。

ChannelHandlerContext

  1. ChannelHanlderContext使得ChannelHandler能够和它的ChannelPipeline以及其他的ChannelHandler交互。
  2. 每当有ChannelHandler添加到ChannelPipeline中时,都会创建ChannelHandlerContext.
    Channel和ChannelPipeline以及ChannelHandlerContext_第1张图片
    3.ChannelHandlerContext中有许多方法也存在于Channel和ChannelPipeline本身上,但是如果调用Channel或者ChannelPipeline上的这些方法,它们将会沿着整个Pipeline进行传播,而调用位于ChannelHandlerContext上的相同方法,则将从当前所关联的ChannelHandler开始。并且只会传播给位于该channelpipeline中的下一个能够处理该事件的handler。
    Channel和ChannelPipeline以及ChannelHandlerContext_第2张图片
    4.一个ChannelHandler可以从属于多个ChannelPipeline.所以它也可以绑定到多个ChannelHandlerContext实例。此时对应的ChannelHandler必须使用@sharable注解,否则会触发异常。

ChannelPipeline

1.ChannelPipeline是一个ChannelHandler的列表,用于处理或拦截Channel的入站事件和出站操作。它实现了一种高级的拦截过滤器模式,使用户可以完全控制事件的处理方式,以及管道中的ChannelHandler如何互相交互。

2.创建ChannelPipeline:每个channel都有自己的管道,在创建channel时自动创建ChannelPipeline.

3.ChannelPipeline中的addLast(String name,ChannelHandler handler)方法。

  • 调用重载的addLast(EventExecutorGroup group, String name, ChannelHandler handler),先通过checkMultiplicity(handler)检查是否添加过此handler.然后创建一个newctx,然后通过addLast0()将newctx添加到此链表中。因此pipeline中的每一个节点是ChannelHandlerContext,每个Context节点包裹了它的执行器Hanlder
    Channel和ChannelPipeline以及ChannelHandlerContext_第3张图片
    Channel和ChannelPipeline以及ChannelHandlerContext_第4张图片

  • 随后,检查是否已经注册,如果没有注册,则添加一个任务到PendingHandlerCallback上。
    Channel和ChannelPipeline以及ChannelHandlerContext_第5张图片
    Channel和ChannelPipeline以及ChannelHandlerContext_第6张图片

  • 如果已经注册,则调用callHandlerAdded0(newCtx),随后执行handler中的handlerAdded(ctx)方法。执行完毕后,将对应的ChannelHandlerContext从pipeline中移除。

你可能感兴趣的:(Netty源码)