分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

Netty入门(六)Decoder(解码器)

发布时间:2023-09-06 01:53责任编辑:郭大石关键词:暂无标签

  Netty 提供了丰富的解码器抽象基类,主要分为两类:

  •  解码字节到消息(ByteToMessageDecoder 和 ReplayingDecoder)
  •  解码消息到消息(MessageToMessageDecoder)

一、ByteToMessageDecoder

  ByteToMessageDecoder 用于将字节转为信息(或其他字节序列)。方法如下:

  

  在下面的例子中,我们将实现从入站 ByteBuf 读取每个整数并将其传递给 pipeline 中的下一个 ChannalInboundHandler。流程如下:

  

  代码如下:

 1 /** 2 ?* 读取四字节,解码成整形 3 ?* 继承于 ByteToMessageDecoder 4 ?* 5 ?*/ 6 public class ToIntegerDecoder extends ByteToMessageDecoder { 7 ?8 ????@Override 9 ????protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {10 ????????if(in.readableBytes() >= 4) { ???????// int是4字节11 ????????????out.add(in.readInt()); ???????????// 添加到解码信息的List中12 ????????}13 ????}14 15 }

  注意,一旦一个消息被编码或解码会自动调用 ReferenceCountUtil.release(message)。如果你稍后还需要用到这个引用,你可以调用 ReferenceCountUtil.retain(message)。

  

二、ReplayingDecoder 

   上面的例子读取缓冲区的数据之前需要检查缓冲区是否有足够的字节,使用 ReplayingDecoder 就无需自己检查。若 ByteBuf 中有足够的字节,则会正常读取;若没有足够的字节则会停止解码。如下:

 1 /** 2 ?* 读取四字节,解码成整形 3 ?* 继承于ReplayingDecoder,不需要检查缓存区是否有足够的字节 4 ?* 5 ?*/ 6 public class ToIntegerDecoder2 extends ReplayingDecoder<Void> { 7 ?8 ????@Override 9 ????protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {10 ????????out.add(in.readInt()); ???// 读取整形并添加到解码信息的List中11 ????}12 ????13 }

 三、MessageToMessageDecoder

   用于从一种消息解码为另一种消息(例如,POJO 到 POJO)。与上面类似,代码就不贴了。

 四、在解码中处理太大的帧

   Netty 是异步架构需要将缓冲区字节存在内存中,知道你能够解码它们。因此,你不能让你的解码器缓存太多的数据以免耗尽可用内存。下面为解决方案:

 1 /** 2 ?* 在解码时处理太大的帧 3 ?* 4 ?*/ 5 public class SafeByteToMessageDecoder extends ByteToMessageDecoder { 6 ????private static final int MAX_FRAME_SIZE = 1024; 7 ?????????8 ????@Override 9 ????protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {10 ????????int readable = in.readableBytes();11 ????????if(readable > MAX_FRAME_SIZE) { ???????// 缓冲区数据过大12 ????????????in.skipBytes(readable); ???????????????// 忽略所有可读的字节13 ????????????// 抛出异常通知这个帧数据超长14 ????????????throw new TooLongFrameException("帧数据超长");15 ????????}16 ????????// TODO 数据编码17 ????}18 19 }

   这种保护很重要,尤其是当你编码一个有可变帧大小的协议的时候。

Netty入门(六)Decoder(解码器)

原文地址:https://www.cnblogs.com/coderJiebao/p/Netty06.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved