【Netty】Netty 核心组件 ( ChannelHandlerContext )
文章目录
- 一、 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
贴一张没有标注的图 : 仅做参考 ;
【Netty】Netty 核心组件 ( ChannelHandlerContext )相关推荐
- Netty 的核心组件
Netty 的核心组件有哪些? 1. Bootstrap 与 ServerBootstrap Bootstrap 与 ServerBootstrap 是 Netty 程序的引导类,主要用于配置各种参数 ...
- Netty的核心组件
Netty是什么? Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序.也就是说,Nett ...
- Netty学习1——Netty的核心组件
Netty的核心组件 Netty的主要构件块:Channel.回调.Future.事件和ChannelHandler 1.Channel Channel是Java NIO的一个基本构造. 它代表一个到 ...
- netty系列之:channelHandlerContext详解
文章目录 简介 ChannelHandlerContext和它的应用 AbstractChannelHandlerContext DefaultChannelHandlerContext 总结 简介 ...
- Netty方法误解ChannelHandlerContext.writeAndFlush(Object msg)
乍一看这个方法,以为什么消息都能输出,因为参数是Object类型的,但实际上,netty内部只支持两种类型,如图 所以,不要想当然的扔个Object进去 转载于:https://www.cnblogs ...
- Netty -Netty心跳检测机制案例,Netty通过WebSocket编程实现服务器和客户端长链接
Netty心跳检测机制案例 案例要求 编写一个Netty心跳检测机制案例,当服务器超过3秒没有读时,就提示读空闲 当服务器超过5秒没有写操作时,提示写空闲 服务器超过7秒没有读或者写操作时,就提示读写 ...
- Netty : netty 4如何解决空轮询bug
1.美图 2.概述 空轮询bug参考:Netty : 臭名昭出的JDK的NIO bug(空轮询bug) 4.netty4 解决 4.1 构建阈值 int selectorAutoRebuildThre ...
- Netty : netty 3如何解决空轮询bug
1.美图 2.概述 空轮询bug参考:Netty : 臭名昭出的JDK的NIO bug(空轮询bug) 3. netty 3 如何解决 netty3采用的是第三种方案,检测重点是select函数是否返 ...
- Netty —— Netty 模型
前文 NIO介绍 NIO -- 三大组件 Netty -- 概述 Netty -- 下载.安装 Reactor 模式(单 Reactor 单线程.单 Reactor 多线程.主从 Reactor 多线 ...
最新文章
- 【怎样写代码】参数化类型 -- 泛型(五):泛型类
- mysql基础小测试三_数据库---MySQL(三)
- 免费OA系统品牌有那些?
- centos 安装部署 zabbix3
- 详解各种锁:CAS、共享锁、排它锁、互斥锁、悲观锁、乐观锁、行级锁、表级锁、页级锁、死锁、JAVA对CAS的支持、ABA问题、AQS原理
- 深入浅出parallelStream
- Flume sink=avro rpc connection error
- centos7离线安装oracle11g,CentOS 7.5离线安装Oracle 11gR2
- 子集和问题 算法_子集问题 主要是去重算法
- Linux平台上最常用的翻译工具—StarDict(星际译王)。
- 家里没有wifi6设备,换wifi6路由器会有提升吗?
- 贺利坚老师汇编课程33笔记:[bx+idata]对同长度字符串进行同步处理
- 兄弟7895dw粉盒清零_兄弟打印机2260D粉盒怎么清零?
- python连接oracle报错:DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: “
- win10MATLAB如何完全卸载,怎么完全卸载cad_win10彻底卸载cad的图文步骤-系统城
- 愚人节,你的微信公众号图文排版够愚吗?
- 大数据开发比赛echarts所有要学习的主要图表 简单化 得分点
- 【Android取证篇】三星手机开启开发者模式
- 笔记本装双系统!win10+Linux!所有的坑自己一个个爬过来,纪念一下。
- 设置了相对定位relative之后,改变top值,如何去掉多余空白?