当前位置: 首页 > web >正文

netty的编解码器,以及内置的编解码器

一、编码器和解码器
1、什么是编码和解码
解码常用于入站操作,将字节转换为消息。编码用于出站,将消息转换为字节流
2、解码器ByteToMessageDecoder和ReplayingDecoder,ReplayingDecoder扩展了ByteToMessageDecoder类,使得我们不必使用readableBytes()方法,下面是两类测试代码

public class ToIntegerDecoder extends ByteToMessageDecoder {@Overridepublic void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List<Object> list) throws Exception {if(in.readableBytes() >=4) {list.add(in.readInt());}}
}
public class ToIntegerDecoder2 extends ReplayingDecoder<Void> {@Overrideprotected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {list.add(byteBuf.readInt());}
}

3、编码器MessageToByteEncoder和MessageToMessageEncoder,其中T是原始消息的类型,这两个类分别代表将消息转换为字节流和将消息转换为其他类型的消息。下面代码分别为这两种的示例代码

public class ShortToByteEncoder extends MessageToByteEncoder<Short> {@Overrideprotected void encode(ChannelHandlerContext channelHandlerContext, Short aShort, ByteBuf byteBuf) throws Exception {byteBuf.writeShort(aShort);}
}
public class IntegerToStringEncoder extends MessageToMessageEncoder<Integer> {@Overrideprotected void encode(ChannelHandlerContext channelHandlerContext, Integer integer, List<Object> list) throws Exception {list.add(String.valueOf(integer));}
}

4、抽象的编解码器
ByteToMessageCodec:对编码和解码的整合,可以理解为对消息解码后再次编码。
MessageToMessageCodec:原理和ByteToMessageCodec同理。

二、内置的编码器和解码器
1、通过SSL/TTL保护的netty程序,通常是将SslHandler放在ChannelPipeline的头部,示例代码如下:

public class SslChannelInitializer extends ChannelInitializer<Channel> {private final SslContext sslContext;private final boolean startTls;public SslChannelInitializer(SslContext sslContext, boolean startTls) {this.sslContext = sslContext;this.startTls = startTls;//如果设置为true,第一个被写入的消息将不会被加密}@Overrideprotected void initChannel(Channel channel) throws Exception {SSLEngine sslEngine = sslContext.newEngine(channel.alloc());channel.pipeline().addFirst("ssl", new SslHandler(sslEngine,startTls));}
}

2、构建netty基于http/https协议的:客户端和服务器分别用HttpClientCodec和HttpServerCodec类即可。

public class HttpInitializer extends ChannelInitializer<Channel> {private final SslContext sslContext;private final boolean isClient;public HttpInitializer(SslContext sslContext, boolean isClient) {this.sslContext = sslContext;this.isClient = isClient;}@Overrideprotected void initChannel(Channel channel) throws Exception {//如果是https协议,则需要在通道下的管道头部追加SslHandlerChannelPipeline pipeline = channel.pipeline();SSLEngine engine = sslContext.newEngine(channel.alloc());pipeline.addFirst("ssl", new SslHandler(engine));if(isClient){pipeline.addLast("codec", new HttpClientCodec());}else {pipeline.addLast("codec", new HttpServerCodec());}}
}

3、websocket:websocket的WebSocketFrame类型通常包括BinaryWebSocketFrame(数据帧,二进制数据)、TextWebSocketFrame(数据帧,文本数据)、CloseWebSocketFrame(控制帧,一个Close请求、关闭的状态码及关闭的原因)、PingWebSocketFrame(控制帧,请求一个PongWebSocketFrame)和PongWebSocketFrame(控制帧,对PingWebSocketFrame进行响应)。
示例代码
websocket的处理类

public class TextFrameHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {@Overridepublic void messageReceived(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {}@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception{//处理数据}
}
public class WebsocketServerInitializer extends ChannelInitializer<Channel> {@Overridepublic void initChannel(Channel ch) throws Exception {ch.pipeline().addLast(new HttpServerCodec(),new HttpObjectAggregator(65536),new WebSocketServerProtocolHandler("/websocket"),new TextFrameHandler());}
}

4、空闲的连接和超时
IdleStateHandler:当连接空闲时间太长会触发事件。ReadTimeoutHandler读超时处理器,WriteTimeoutHandler写超时处理器
用法也是将他们的对象注册到通道里的管道中去。

channel.pipeline().addLast(new IdleStateHandler(0, 0, 60, TimeUnit.SECONDS));
http://www.xdnf.cn/news/16125.html

相关文章:

  • OpenCV 零基础到项目实战 | DAY 1:图像基础与核心操作
  • LLC协议
  • mysql_innodb_cluster_metadata源数据库
  • Vue3 面试题及详细答案120道(31-45 )
  • Web3面试题
  • 智慧能源合同解决方案
  • 【接口自动化】pytest的基本使用
  • XML高效处理类 - 专为Office文档XML处理优化
  • Aspose.Cells 应用案例:法国能源企业实现能源数据报告Excel自动化
  • Python通关秘籍(五)数据结构——元组
  • Rocky Linux 9 快速安装 Node.js
  • 3.5 模块化编程实践
  • 【数据结构初阶】--栈和队列(二)
  • Python之格式化Conda中生成的requirements.txt
  • 我的第一个开源项目 -- 实时语音识别工具
  • 数据库表介绍
  • 算法提升之字符串回文处理-(manacher)
  • 自编码器表征学习:重构误差与隐空间拓扑结构的深度解析
  • 客户案例 | Jabil 整合 IT 与运营,大规模转型制造流程
  • 《小白学习产品经理》第八章:方法论之马斯洛需求层次理论
  • Java新特性-record
  • 力扣-139.单词拆分
  • js的基本内容:引用、变量、打印、交互、定时器、demo操作
  • 网络安全基础作业三
  • lspci/setpci用法小结
  • SpringBoot--Mapper XML 和 Mapper 接口在不同包
  • halcon手眼标定z方向实操矫正
  • [2025CVPR]ViKIENet:通过虚拟密钥实例增强网络实现高效的 3D 对象检测
  • React 项目性能优化概要
  • vs2017 c++ 使用sqlite3数据库