文章目录
一、 ChannelHandlerContext 组件二、 ChannelHandlerContext 组件 debug 调试三、 ChannelHandlerContext 组件 debug 调试结果分析一、 ChannelHandlerContext 组件
1 . ChannelHandlerContext 通道处理者上下文对象 :
① 保存信息 :ChannelHandlerContext 类中保存与 Channel 通道 , ChannelHandler 通道处理者 , 相关的信息 ;
② 关联处理者 :ChannelHandlerContext 内部维护了一个 ChannelHandler 对象 ;
2 . 相关组件对应关系 :
① 整体脉络 :ChnnelPipeline 本质是双向链表 , 每个元素都是一个 ChannelHandlerContext 对象 , 每个 ChannelHandlerContext 都对应关联了一个 ChannelHandler 对象 ;
② ChnnelPipeline 与 ChannelHandlerContext 对应关系 :111 个 ChannelPipeline 对应多个 ChannelHandlerContext ;
③ ChannelHandlerContext 与 ChannelHandler 对应关系 :1:11:11:1 ;
3 . ChannelHandlerContext 常用方法 :
① 获取通道 :在 ChannelHandlerContext 接口中定义的方法 ;
Channel channel();
② 获取管道 :在 ChannelHandlerContext 接口中定义的方法 ;
ChannelPipeline pipeline();
③ 获取处理器 :在 ChannelHandlerContext 接口中定义的方法 ;
ChannelHandler handler();
④ 刷新数据 :在 ChannelHandlerContext 接口中定义的方法 ;
ChannelHandlerContext flush();
⑤ 关闭通道 :在 ChannelOutboundInvoker 接口中定义的方法 ;
ChannelFuture close();
⑥ 写出数据 :在 ChannelOutboundInvoker 接口中定义的方法 , 作用是将数据写出到 ChannelPipeline 管道中 ;
ChannelFuture writeAndFlush(Object msg);
二、 ChannelHandlerContext 组件 debug 调试
1 . 代码及断点 :运行 【Netty】使用 Netty 开发 HTTP 服务器 | 三、 HTTP 服务器代码实现 中的 HTTP 服务器代码 , 在用户自定义的 HTTPServerHandler 类的 channelRead0 方法中打断点 , 查看该方法的 ChannelHandlerContext ctx 参数信息 ;
这里只列举部分代码 , 在获取 channelRead0 方法的代码处打上断点 , 查看 ChannelHandlerContext 类型参数信息 ;
public class HTTPServerHandler extends SimpleChannelInboundHandler<HttpObject> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {if(msg instanceof HttpRequest){//判断该 HttpObject msg 参数是否是 Http 请求// 在此处打断点, 查看 ChannelHandlerContext ctx 参数的信息System.out.println(ctx.channel().remoteAddress() + " 客户端请求数据 ... ");// ...}}//...}
2 . 运行程序进入断点 :
① debug 运行服务器程序 :
② 浏览器访问 :访问 http://127.0.0.1:8888 地址 , 目前卡在断点 , 无法成功获取 HTTP 资源 ;
③ 服务器端进入断点 :可以查看 ChannelHandlerContext ctx 参数的具体信息 ;
三、 ChannelHandlerContext 组件 debug 调试结果分析
1 . ChannelHandlerContext 接口的具体实现类型 :在 重写的 SimpleChannelInboundHandler 的 protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception 方法中 , ctx 参数的实际类型是DefaultChannelHandlerContext;
2 . ChannelHandlerContext 双向链表相关分析 :
① 双向链表元素位置 :该 ChannelHandlerContext ctx 是 ChannelPipeline 的 ChannelHandlerContext 类型双向链表的一部分 , 由上一篇博客 【Netty】Netty 核心组件 ( ChannelPipeline 中的 ChannelHandlerContext 双向链表分析 ) | 三、 Pipeline / ChannelPipeline 管道内双向链表分析 , 分析可知 , 该 ctx 是整个双向链表的第 333 个元素 ;
② 双向链表前一个元素 :HttpServerCodec 服务器编解码器 , 用于 HTTP 协议数据的编码 , 解码处理 ;
③ 双向链表后一个元素 :后面就是双向链表尾部元素 , 是 DefaultChannelPipeline ;
④ 双向链表 :DefaultChannelPipeline <-> ChannelInitializer <-> HttpServerCodec <-> SimpleChannelInboundHandler ( 自定义派生类 ) <-> DefaultChannelPipeline
贴一张没有标注的图 :仅做参考 ;