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
channelPipe提供添加channelhandler及一系列firexxx方法,defaultPipeline中fire系列的实现为找到head节点,调用其包装的handler(前面说过ctx就是包装的handler)xxx方法,而其handler的又会调用ctx.firexxx方法,此方法会找到pipeline中下一个ctx,如此往复,直到遍历完pipeline。所以我们要实现多个自定义handler传递时,记住在最后调用ctx.firexxx,才能传递下去。可以用fireChannelRead跟踪以下代码,验证是否上面说的那样。
ChannelHandlerContext
context提供了fireXXXf方法,
public ChannelHandlerContext fireChannelRead(final Object msg) {
// 用于调用下一个ctx的handler的ChannelRead方法
invokeChannelRead(findContextInbound(), msg);
return this;
}
ChannelHandler
这个就是我们在启动服务时设置的handler,启动时和新连接会将它添加到pipeline中(前文已经讲过).