【Netty】Netty 核心组件 ( ChannelHandlerContext )

举报
韩曙亮 发表于 2022/01/10 23:38:45 2022/01/10
【摘要】 文章目录 一、 ChannelHandlerContext 组件二、 ChannelHandlerContext 组件 debug 调试三、 ChannelHandlerContext 组件 de...





一、 ChannelHandlerContext 组件



1 . ChannelHandlerContext 通道处理者上下文对象 :


① 保存信息 : ChannelHandlerContext 类中保存与 Channel 通道 , ChannelHandler 通道处理者 , 相关的信息 ;

② 关联处理者 : ChannelHandlerContext 内部维护了一个 ChannelHandler 对象 ;



2 . 相关组件对应关系 :


① 整体脉络 : ChnnelPipeline 本质是双向链表 , 每个元素都是一个 ChannelHandlerContext 对象 , 每个 ChannelHandlerContext 都对应关联了一个 ChannelHandler 对象 ;

② ChnnelPipeline 与 ChannelHandlerContext 对应关系 : 1 1 1 个 ChannelPipeline 对应多个 ChannelHandlerContext ;

③ ChannelHandlerContext 与 ChannelHandler 对应关系 : 1 : 1 1:1 1:1 ;



3 . ChannelHandlerContext 常用方法 :


① 获取通道 : 在 ChannelHandlerContext 接口中定义的方法 ;

Channel channel();

  
 
  • 1

② 获取管道 : 在 ChannelHandlerContext 接口中定义的方法 ;

ChannelPipeline pipeline();

  
 
  • 1

③ 获取处理器 : 在 ChannelHandlerContext 接口中定义的方法 ;

ChannelHandler handler();

  
 
  • 1

④ 刷新数据 : 在 ChannelHandlerContext 接口中定义的方法 ;

ChannelHandlerContext flush();

  
 
  • 1

⑤ 关闭通道 : 在 ChannelOutboundInvoker 接口中定义的方法 ;

ChannelFuture close();

  
 
  • 1

⑥ 写出数据 : 在 ChannelOutboundInvoker 接口中定义的方法 , 作用是将数据写出到 ChannelPipeline 管道中 ;

ChannelFuture writeAndFlush(Object msg);

  
 
  • 1




二、 ChannelHandlerContext 组件 debug 调试



1 . 代码及断点 : 运行 【Netty】使用 Netty 开发 HTTP 服务器 | 三、 HTTP 服务器代码实现 中的 HTTP 服务器代码 , 在用户自定义的 HTTPServerHandler 类的 channelRead0 方法中打断点 , 查看该方法的 ChannelHandlerContext ctx 参数信息 ;

这里只列举部分代码 , 在获取 channelRead0 方法的代码处打上断点 , 查看 ChannelHandlerContext 类型参数信息 ;

public class HTTPServerHandler extends SimpleChannelInboundHandler<HttpObject> {
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {
        if(msg instanceof HttpRequest){ //判断该  HttpObject msg 参数是否是 Http 请求
        	// 在此处打断点, 查看 ChannelHandlerContext ctx 参数的信息
            System.out.println(ctx.channel().remoteAddress() + " 客户端请求数据 ... ");
            // ...
        }
    }
    //...
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述



2 . 运行程序进入断点 :


① debug 运行服务器程序 :

在这里插入图片描述


② 浏览器访问 : 访问 http://127.0.0.1:8888 地址 , 目前卡在断点 , 无法成功获取 HTTP 资源 ;

在这里插入图片描述


③ 服务器端进入断点 : 可以查看 ChannelHandlerContext ctx 参数的具体信息 ;

在这里插入图片描述





三、 ChannelHandlerContext 组件 debug 调试结果分析



1 . ChannelHandlerContext 接口的具体实现类型 : 在 重写的 SimpleChannelInboundHandlerprotected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception 方法中 , ctx 参数的实际类型是 DefaultChannelHandlerContext ;



2 . ChannelHandlerContext 双向链表相关分析 :


① 双向链表元素位置 : 该 ChannelHandlerContext ctx 是 ChannelPipeline 的 ChannelHandlerContext 类型双向链表的一部分 , 由上一篇博客 【Netty】Netty 核心组件 ( ChannelPipeline 中的 ChannelHandlerContext 双向链表分析 ) | 三、 Pipeline / ChannelPipeline 管道内双向链表分析 , 分析可知 , 该 ctx 是整个双向链表的第 3 3 3 个元素 ;

② 双向链表前一个元素 : HttpServerCodec 服务器编解码器 , 用于 HTTP 协议数据的编码 , 解码处理 ;

③ 双向链表后一个元素 : 后面就是双向链表尾部元素 , 是 DefaultChannelPipeline ;

④ 双向链表 : DefaultChannelPipeline <-> ChannelInitializer <-> HttpServerCodec <-> SimpleChannelInboundHandler ( 自定义派生类 ) <-> DefaultChannelPipeline

在这里插入图片描述

贴一张没有标注的图 : 仅做参考 ;

在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/106604751

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。