Netty 源码 ChannelHandler(三)概述
Netty 源码 ChannelHandler(三)概述
Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html)
一、ChannelInboundHandler 和 ChannelOutboundHandler
Netty 中的事件分为 Inbound 事件和 Outbound 事件。
Inbound 事件通常由 IO 线程触发例如 TCP 链路建立事件、链路关闭事件、读事件、异常通知事件。触发 Inbound 事件的方法如下:
操作 | 说明 |
---|---|
channelRegistered | channel 注册到 eventLoop |
channelUnregistered | channel 取消注册 |
channelActive | channel 连接 |
channelInactive | channel 失连 |
channelRead | 读 |
channelReadComplete | 读完成 |
userEventTriggered | 用户自定义事件 |
channelWritabilityChanged | 写状态改变?? |
exceptionCaught | 异常 |
Outbound 事件通常是由用户主动发起的网络 IO 操作,例如用户发起的连接操作、绑定操作、消息发送等操作。
操作 | 说明 |
---|---|
bind | 绑定端口 |
connect | 连接 |
disconnect | 断开连接 |
close | 关闭 channel |
read | 读 |
write | 写 |
flush | 刷新 |
deregister | channel 取消注册 |
二、ChannelHandler 功能说明
2.1 ByteToMessageDecoder 和 MessageToByteEncoder
将读取到的字节数组或者字节缓冲区解码为业务可以使用的 POJO 对象。为了方便业务将 Bytebuf 解码成业务 POJO 对象,Netty 提供了 ByteToMessageDecoder 抽象工具解码类。
public MyByteToMessageDecoder extends ByteToMessageDecoder {
public void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
}
}
注意: ByteToMessageDecoder 并没有考虑 TCP 粘包和组包等场景,读半包需要用户解码器自己负责处理。
MessageToByteEncoder 则相反将 POJO 对象编码成 ByteBuf:
public MyMessageToByteEncoder extends MessageToByteEncoder {
public void encode(ChannelHandlerContext ctx, I msg, ByteBuf out) throws Exception {
}
}
2.2 MessageToMessageDecoder 和 MessageToMessageEncoder
将一个 POJO 对象编码成另一个对象,以 HTTP + XML 协议为例,它的一种实现方式是:先将 POJO 对象编码成 XML 字符串,再将字符串编码为 HTTP 请求或者应答消息。对于复杂协议,往往需要经历多次编码,为了便于功能扩展,可以通过多个编码器组合来完成。
public MyMessageToMessageDecoder extends MessageToMessageDecoder {
public void decode(ChannelHandlerContext ctx, I msg, List<Object> out) {
}
}
2.3 LengthFieldBasedFrameDecoder 和 LengthFieldPrepender
每天用心记录一点点。内容也许不重要,但习惯很重要!
Netty 源码 ChannelHandler(三)概述的更多相关文章
- Netty 源码 ChannelHandler(四)编解码技术
Netty 源码 ChannelHandler(四)编解码技术 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 一.拆包与粘 ...
- Netty源码分析(前言, 概述及目录)
Netty源码分析(完整版) 前言 前段时间公司准备改造redis的客户端, 原生的客户端是阻塞式链接, 并且链接池初始化的链接数并不高, 高并发场景会有获取不到连接的尴尬, 所以考虑了用netty长 ...
- netty源码解解析(4.0)-17 ChannelHandler: IdleStateHandler实现
io.netty.handler.timeout.IdleStateHandler功能是监测Channel上read, write或者这两者的空闲状态.当Channel超过了指定的空闲时间时,这个Ha ...
- netty源码解解析(4.0)-20 ChannelHandler: 自己实现一个自定义协议的服务器和客户端
本章不会直接分析Netty源码,而是通过使用Netty的能力实现一个自定义协议的服务器和客户端.通过这样的实践,可以更深刻地理解Netty的相关代码,同时可以了解,在设计实现自定义协议的过程中需要解决 ...
- Netty 源码 Channel(一)概述
Netty 源码 Channel(一)概述 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) Channel 为 Netty ...
- Netty 源码 NioEventLoop(三)执行流程
Netty 源码 NioEventLoop(三)执行流程 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 上文提到在启动 N ...
- Netty源码分析第5章(ByteBuf)---->第5节: directArena分配缓冲区概述
Netty源码分析第五章: ByteBuf 第五节: directArena分配缓冲区概述 上一小节简单分析了PooledByteBufAllocator中, 线程局部缓存和arean的相关逻辑, 这 ...
- Netty 源码(ChannelHandler 死磕)
精进篇:netty源码死磕5 - 揭开 ChannelHandler 的神秘面纱 目录 1. 前言 2. Handler在经典Reactor中的角色 3. Handler在Netty中的坐标位置 4 ...
- ChannelHandler揭秘(Netty源码死磕5)
精进篇:netty源码死磕5 揭开 ChannelHandler 的神秘面纱 目录 1. 前言 2. Handler在经典Reactor中的角色 3. Handler在Netty中的坐标位置 4. ...
随机推荐
- node-rsa
[node-rsa] 引用 var NodeRSA = require('node-rsa') 生成一个私钥长度为512的key(同时生成公钥) var key = new NodeRSA({b: 5 ...
- python-ceilometerclient命令行(终结)
ceilometerclient入口 工程ceilometerclient shell.py中的main方法 ceilometerclient目录 --ceilometerclient --commo ...
- unity中Android环境变量配置
http://www.cnblogs.com/windytrees/p/7533477.html
- frame嵌套页面元素的定位
这里当出现页面嵌套的时候怎么定位?frame就是对于嵌套页面的定位,今天具体说一下 前期准备工作:先编写一个HTML网页,带有嵌套的,方便我们在案例中使用按照如下截图的代码编写就好了,然后保存为HTM ...
- python 多线程操作数据库
如果使用多线程操作数据库,容易引起多用户操作锁表 OperationalError: (2013, 'Lost connection to MySQL server during query') 使用 ...
- 解决谷歌浏览器频繁出现adobe flash player因过期而遭到阻止的问题(转自知乎)
作者:在战争中链接:https://www.zhihu.com/question/32223811/answer/128088278来源:知乎著作权归作者所有,转载请联系作者获得授权. 很多新用户在安 ...
- 分布式监控系统Zabbix-3.0.3-完整安装记录
由于采用sendmail发送邮件,常常会被认为是垃圾邮件被拒,所以不推荐这种方式!这里,针对zabbix报警信息的发送,可以采用下面两种方式中的任意一种:1)利用sendEmail程序来发送报警邮件. ...
- vue项目中,localhost可以访问,IP无法访问的问题
用http://localhost:8082/可以访问,但是换到ip就访问不了,127.0.0.1.0.0.0.0访问也可以,就ip不行 根源----在config里面的index.js里面的modu ...
- 198. House Robber(Array; DP)
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- python3.6.5 路径处理与规范化
在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠. >>> os.path.normcase('c: ...