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(三)概述的更多相关文章

  1. Netty 源码 ChannelHandler(四)编解码技术

    Netty 源码 ChannelHandler(四)编解码技术 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 一.拆包与粘 ...

  2. Netty源码分析(前言, 概述及目录)

    Netty源码分析(完整版) 前言 前段时间公司准备改造redis的客户端, 原生的客户端是阻塞式链接, 并且链接池初始化的链接数并不高, 高并发场景会有获取不到连接的尴尬, 所以考虑了用netty长 ...

  3. netty源码解解析(4.0)-17 ChannelHandler: IdleStateHandler实现

    io.netty.handler.timeout.IdleStateHandler功能是监测Channel上read, write或者这两者的空闲状态.当Channel超过了指定的空闲时间时,这个Ha ...

  4. netty源码解解析(4.0)-20 ChannelHandler: 自己实现一个自定义协议的服务器和客户端

    本章不会直接分析Netty源码,而是通过使用Netty的能力实现一个自定义协议的服务器和客户端.通过这样的实践,可以更深刻地理解Netty的相关代码,同时可以了解,在设计实现自定义协议的过程中需要解决 ...

  5. Netty 源码 Channel(一)概述

    Netty 源码 Channel(一)概述 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) Channel 为 Netty ...

  6. Netty 源码 NioEventLoop(三)执行流程

    Netty 源码 NioEventLoop(三)执行流程 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 上文提到在启动 N ...

  7. Netty源码分析第5章(ByteBuf)---->第5节: directArena分配缓冲区概述

    Netty源码分析第五章: ByteBuf 第五节: directArena分配缓冲区概述 上一小节简单分析了PooledByteBufAllocator中, 线程局部缓存和arean的相关逻辑, 这 ...

  8. Netty 源码(ChannelHandler 死磕)

    精进篇:netty源码死磕5  - 揭开 ChannelHandler 的神秘面纱 目录 1. 前言 2. Handler在经典Reactor中的角色 3. Handler在Netty中的坐标位置 4 ...

  9. ChannelHandler揭秘(Netty源码死磕5)

    精进篇:netty源码死磕5  揭开 ChannelHandler 的神秘面纱 目录 1. 前言 2. Handler在经典Reactor中的角色 3. Handler在Netty中的坐标位置 4. ...

随机推荐

  1. python远程操作服务器

    python远程控制 标签(空格分隔): 远程Linux python远程控制:方案: Paramiko Pexpect(主要Linux机器) 安装Paramiko pip install param ...

  2. JIT物料在途未清PO作为供给

    以下是本应在TEMP中处理,目前是写到FP_CHECK_SAP_DATA中 ----JIT物料在途未清PO作为供给 add by landor on 20180809 INSERT INTO SAP_ ...

  3. MS17-010漏洞检测

    1.扫描脚本的下载和加载 由于Metasploit还没有更新MS17-010检测的模块,所以要去exploit-db下载,并在MSF中加载. cd /usr/share/metasploit-fram ...

  4. Pandas汇总和处理缺失数据

    汇总的函数 方法 说明 count 非NA的值数量 describe 针对Series和DataFrame列计算汇总统计 min.max 计算最小值和最大值 argmin.argmax 计算能够获取到 ...

  5. GsonFormat的使用 (转)

    一.Android Studio快速添加Gson 具体操作:        1.File->Project Structure:   2.app->Dependencies->&qu ...

  6. oracleXE数据库没有公开wm_concat函数, 需要手动添加

    CREATE OR REPLACE TYPE wm_concat_impl AUTHID CURRENT_USER AS OBJECT ( curr_str ), STATIC FUNCTION od ...

  7. phacon只能访问index action

    location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?_url=$1 last; break; } }

  8. 01背包 hdu1864

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1864 注意事项: 在这里所有输入的价格都是两位小数(题目没说,看论坛才知道的). 这里单项价格不能超过 ...

  9. HDFS 总结

    HDFS是一个分布式文件存储系统 Client  提交读写请求(拆分blocksize) NameNode 全局把控(知道blocksize的地址) dataNode 存储数据(将数据存储进去,且以P ...

  10. 贪吃蛇GamePanel Java实现(二)

    package cn.tcc.snake.tcc.View; import java.awt.Color;import java.awt.Graphics; import javax.swing.JP ...