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. 签名Cookie

    [签名Cookie] set-cookie时加上防篡改验证码. 如: user_name=alex|bj95ef23cc6daecc475de   防篡改验证码的生成规则可以很简单:md5(cooki ...

  2. Shader基础(固定管线着色器)

    在Shader的编码中,要养成不加空格的习惯,否则会有时候出现一些错误 固定管线着色器: 优点:实现简单 缺点:处理的效果比较差 //设置Shader的路径 Shader "MyFixedS ...

  3. sqlserver 死锁相关

    参考 https://www.cnblogs.com/fuyuanming/p/5783421.html -- 查询死锁 select request_session_id spid, OBJECT_ ...

  4. Redis数据结构的多种用法

    分布式锁(string) setnx key value,当key不存在时,将 key 的值设为 value ,返回1.若给定的 key 已经存在,则setnx不做任何动作,返回0. 当setnx返回 ...

  5. phpstorm添加站点

    1.在界面上快捷键 ctrl+alt+s 或打开File->settings 2.找到Deployment 设置完后确定即可使用.

  6. as3.0 橡皮功能2

    package com{ import flash.display.MovieClip; import flash.display.Bitmap; import flash.display.Bitma ...

  7. LibreOJ 6280 . 数列分块入门 4

    题目链接:https://loj.ac/problem/6280 加一个数组保存块的和. 代码: #include<iostream> #include<cstring> #i ...

  8. Adb logcat 抓日志

    http://blog.csdn.net/hujiachun1234/article/details/43271149 http://www.cnblogs.com/medsonk/p/6344373 ...

  9. 方法装饰器(Decorator)

    代码: function enhance(target, key, descriptor) { const method = descriptor.value; let extraSpeed = 50 ...

  10. AIO编程

    AIO编程,在NIO基础之上引入了异步通道的概念,并提供了异步文件和异步套接字通道的实现,从而在真正意义上实现了异步非阻塞,之前我们学习的NIO只是非阻塞而并非异步.而AIO它不需要通过多路复用器对注 ...