Netty提供了很多内置的处理器,高效地利用这些处理器,可以经过简单的配置就可以实现部分复杂功能,而不是自己花时间和精力去重复造“轮子”。

要使用,得先知道,本文主要依据《netty实战》一书进行的梳理,结合了实际应用经验进行了整理。

解码器

ByteToMessageDecoder:是最基础的解码器,将字节数组解析为消息。

ReplayingDecoder:继承自ByteToMessageDecoder,使得我们不必调用readableBytes()方法来判断是否有足够的数据可被读取。

LineBasedFrameDecoder:使用了行尾控制字符(\n 或者\r\n)来解析消息数据。

MessageToMessageDecoder:将一种消息的格式转换为另外一种。

HttpObjectAggregator:同样是解码器的一个子类,非常复杂,处理http请求。

注意:由于Netty 是一个异步框架,所以需要在字节可以解码之前在内存中缓冲它们。因此,不能让解码器缓冲大量的数据以至于耗尽可用的内存。为了解除这个常见的顾虑,Netty 提供了TooLongFrameException 类,其将由解码器在帧超出指定的大小限制时抛出。

编码器

MessageToByteEncoder:最基本的编码器,将消息编码为字节数组。

MessageToMessageEncoder:将一种消息的格式转换为另外一种。

编解码器

编解码器可以在同一个类中管理入站和出站数据和消息的转换。

ByteToMessageCodec:基类,同时实现了ChannelInboundHandler 和ChannelOutboundHandler 接口,但不是直接实现,而是间接实现。
public abstract class ByteToMessageCodec extends ChannelDuplexHandler
public class ChannelDuplexHandler extends ChannelInboundHandlerAdapter implements ChannelOutboundHandler

MessageToMessageCodec:消息间的编解码。

从重用的角度来说,将编码和解码放到一个类中管理会丧失灵活性,这里有一种途径来解决该问题,使用CombinedChannelDuplexHandler。这个类充当了ChannelInboundHandler 和ChannelOutboundHandler(该类的类型参数I 和O)的容器。

public class CombinedByteCharCodec extends
CombinedChannelDuplexHandler<ByteToCharDecoder, CharToByteEncoder> {public CombinedByteCharCodec() {super(new ByteToCharDecoder(), new CharToByteEncoder());
}
}

安全传输

SslHandler:用于加密传输。

Http请求

Http编解码器

HttpServerCodec:服务端,进行http编码和解码,实际是HttpRequestDecoder和HttpResponseEncoder两个的组合。
HttpClientCodec:客户端,进行http编码和解码,实际是HttpRequestEncoder和HttpResponseDecoder两个的组合。

这里用到了我们上章提到的复合编解码器的CombinedChannelDuplexHandler
public final class HttpClientCodec extends CombinedChannelDuplexHandler<HttpResponseDecoder, HttpRequestEncoder>
implements HttpClientUpgradeHandler.SourceCodec

Http聚合器

HttpObjectAggregator:http消息通常是多部分组成,以请求为例,通常由HttpHeader、HttpContent(1个或多个)、LastHttpContent,该处理器可以将tcp多次传输的结果组合为一个完整的http请求。

Http压缩解压器

压缩与解压是为了提高性能。
HttpContentCompressor,放在服务端。
HttpContentDecompressor,放在客户端。

WebSocket处理器

WebSocketServerProtocolHandle:负责处理服务端的握手和控制(Ping、Pong、Close),不负责TextWebSocketFrame、BinaryWebSocketFrame和ContinuationWebSocketFrame。

空闲的连接和超时

IdleStateHandler:空闲检测,通常用于心跳保持,可分别设置读空闲、写空闲和读写都空闲的时间
pipeline.addLast_(new IdleStateHandler(_5,0,0, TimeUnit.SECONDS));

如超出后,可触发空闲事件,由下个处理器在userEventTriggered中处理

public class HeartbeatTimeoutHandler extends ChannelInboundHandlerAdapter {@Overridepublic void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {if(evt instanceof IdleStateEvent){IdleStateEvent event=(IdleStateEvent)evt;if(event.state().equals(IdleState.READER_IDLE)){log.info("读空闲");}}else{//非空闲事件,传递到下个处理器super.userEventTriggered(ctx,evt);}}
}

netty不仅内置了灵活性最大的IdleStateHandler,实际还内置了两个可以直接使用的读超时和写超时处理器,对于心跳机制,如果是客户端发心跳请求,服务端发心跳响应,那么我们完全可以直接使用ReadTimeoutHandler,而不需要使用IdleStateHandler+自定义处理器实现

解码基于分隔符的协议和基于长度的协议

DelimiterBasedFrameDecoder:使用任何由用户提供的分隔符来提取帧的通用解码器
LineBasedFrameDecoder:提取由行尾符(\n 或者\r\n)分隔的帧的解码器。
FixedLengthFrameDecoder:提取在调用构造函数时指定的定长帧
LengthFieldBasedFrameDecoder:根据编码进帧头部中的长度值提取帧;该字段的偏移量以及长度在构造函数中指定

写大型数据

如果是直接传输文件内容,不做处理,建议使用FileRegion来实现,充分利用零拷贝特性。

如还需要对文件内容处理,则netty内置了ChunkedWriteHandler,不会消耗大量内存,但是需要结合以下类使用
![image.png](https://img-blog.csdnimg.cn/img_convert/98a0d29e772dd53fc4697f9b8c321af6.png#clientId=u528a172e-1fa9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=216&id=uec0ebae6&margin=[object Object]&name=image.png&originHeight=238&originWidth=1068&originalType=binary&ratio=1&rotation=0&showTitle=false&size=66486&status=done&style=none&taskId=u27e0de38-3722-4fd5-8104-cca6d0a8243&title=&width=970.9090698652036)

Netty内置处理器整理相关推荐

  1. Netty内置处理器以及编解码器

    一.Netty已经为我们提供了常用协议的处理器,我们直接使用就可以 可以看到包括redis协议,http协议等主流协议的编码解码器,netty都为我们提供了. 二.代码测试 使用netty直接对red ...

  2. python文档整理,Python官方文档内置函数整理Word版

    <Python官方文档内置函数整理Word版>由会员分享,可在线阅读,更多相关<Python官方文档内置函数整理Word版(6页珍藏版)>请在人人文库网上搜索. 1.传播优秀W ...

  3. python3.7版本内置函数_python3.7内置函数整理笔记

    #python3.7 内置函数整理 #abs(x) #返回数字的绝对值. 参数可以是整数或浮点数. 如果参数是复数,则返回其大小 # print(abs(1)) # print(abs(-1)) # ...

  4. golang中字符串内置函数整理

    字符串内置函数 1. 判断字符串的长度 str := "korea国" fmt.Println("str len=", len(str)) 2. 字符串遍历,同 ...

  5. 迭代器、for循环本质、生成器、常用内置方法整理

    迭代器 什么是迭代器 迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 为什么要用迭代器 迭代器给你提供了一种不依赖索引取值的方式 重复+每次迭代都是基于上一次的 ...

  6. python函数整理_python内置函数整理

    为了方便记忆,将这些内置函数进行了如下分类:数学运算(7个) 类型转换(24个) 序列操作(8个) 对象操作(7个) 反射操作(8个) 变量操作(2个) 交互操作(2个) 文件操作(1个) 编译执行( ...

  7. python常用内置函数总结-python常用内置函数整理—反射

    函数是组织好的,能够重复使用的,用来实现单一,或相关联功能的代码段.python提供了许多内建函数,这些函数提高了应用的模块性,和代码的重复利用率.下面是小编整理的python内建函数中的反射类,希望 ...

  8. python帮助文档中查看内置函数_PYTHON官方文档内置函数整理

    一.数学运算类 abs(x) 求绝对值 1 .参数可以是整型,也可以是复数 2 .若参数是复数,则返回复数的模 complex([real[, imag]]) 创建一个复数 divmod(a, b) ...

  9. Netty框架进阶篇 - 分析和实战内置的编解码器及ChannelHandler

    文章目录 前言 基于Netty构建HTTP/HTTPS应用程序 HTTP协议相关编解码器 HTTP聚合消息 HTTP压缩 配置SSL,启用HTTPS 实战 空闲的连接和超时 序列化 基于Protoco ...

最新文章

  1. spring事件通知机制详解
  2. 【office学习网站】
  3. SAP UI5 ResponsiveGridLayout
  4. mysql定义条件和处理_mysql sql存储过程条件定义与处理
  5. Linux定时备份Oracle Database 翻译
  6. hdu1166 经典线段入门
  7. 排序算法之 Shell Sort
  8. 服务器网口显示图像,简单的python3web服务器,可以在浏览器中显示图像
  9. python tkinter画动态时钟
  10. 【数据结构排序算法(五)】二路归并排序
  11. 在linux系统上搭建测试环境
  12. 推荐几个下载英文原版电子书的网站-PDF
  13. Win10+Android+夜神安卓模拟器 搭建ReactNative开发环境
  14. 线性不可分转可分----低维空间转高维空间
  15. Android学习之仿QQ讨论组和微信群聊头像
  16. 选择合适的垃圾收集器
  17. 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
  18. 大学综合测评中,使用VBA代码自动完成EXCEL成绩表
  19. 计算机软件开发行业前景
  20. 综述(七)北斗导航系统详述

热门文章

  1. 在CentOS 7 安装Calamari
  2. 华为/阿里等公司招聘缩减!科技行业出现衰退?
  3. 婴儿大脑MRI图谱集
  4. 做独立站要做私域营销,做亚马逊更要做私域营销,Why?
  5. 数学建模比赛经验总结
  6. ES系列-- ILM索引生命周期管理
  7. 四巫日来临本周硅铁、铁矿石领跌,铁矿石认沽最高31倍,钢厂利润回升2022.6.17
  8. 面试后HR让你等通知的真相
  9. 【lc3】汇编实现I/O中断
  10. html文本下一页,Javascript html2canvas + jsPDF 导出PDF,解决一半文字在上一页一半文字在下一页的问题...