ChannelPipeline,ChannelHandler,ChannelHandlerContext关系及简要代码

ChannelPipeline,ChannelHandler,ChannelHandlerContext关系及简要代码

三者的关系

1.每当ServerSocket创建一个新的连接,就会创建一个Socket,对应的就是目标客户端。

2.每一个新创建的Socket都将会分配一个全新的ChannelPipeline

3.每一个ChannelPipeline内部都含有多个ChannelHnadlerContext

pipeline内部是双向链表。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MUCJBaY7-1594740081579)(C:\myboot\boot\note\images\pipeline,handler,context的关系.png)]

ChannelPipe

ChannelPipeline,ChannelHandler,ChannelHandlerContext关系及简要代码_第1张图片

channelPipe提供添加channelhandler及一系列firexxx方法,defaultPipeline中fire系列的实现为找到head节点,调用其包装的handler(前面说过ctx就是包装的handler)xxx方法,而其handler的又会调用ctx.firexxx方法,此方法会找到pipeline中下一个ctx,如此往复,直到遍历完pipeline。所以我们要实现多个自定义handler传递时,记住在最后调用ctx.firexxx,才能传递下去。可以用fireChannelRead跟踪以下代码,验证是否上面说的那样。

ChannelHandlerContext

ChannelPipeline,ChannelHandler,ChannelHandlerContext关系及简要代码_第2张图片

context提供了fireXXXf方法,

public ChannelHandlerContext fireChannelRead(final Object msg) {
       //  用于调用下一个ctx的handler的ChannelRead方法
        invokeChannelRead(findContextInbound(), msg);
        return this;
    }

ChannelHandler

这个就是我们在启动服务时设置的handler,启动时和新连接会将它添加到pipeline中(前文已经讲过).

你可能感兴趣的:(netty,源码分析)