什么是编码器和解码器?

从网络传输的角度来讲,数组总是以字节的格式在网络之中进行传输的。 每当源主机发送数据到目标主机时,数据会从本地格式被转换成字节进行传输,这种转换被称为编码,编码的逻辑由编码器处理。 每当目标主机接受来自源主机的数据时,数据会从字节转换为我们需要的格式,这种转换被称为解码,解码的逻辑由解码器处理。

在Netty中,编码解码器实际上是ChannelOutboundHandler和ChannelInboundHandler的实现, 因为编码和解码都属于对数据的处理,由此看来,编码解码器被设计为ChannelHandler也就无可厚非。

解码器

在Netty中,解码器是ChannelInboundHandler的实现,即处理入站数据。 解码器主要分为两种:

  • 将字节解码为Message消息: ByteToMessageDecoder和ReplayingDecoder。
  • 将一种消息解码为另一种消息: MessageToMessageDecoder。

ByteToMessageDecoder

ByteToMessageDecoder用于将字节解码为消息,如果我们想自定义解码器,就需要继承这个类并实现decode方法。 decode方法是自定解码器必须实现的方法,它被调用时会传入一个包含了数据的ByteBuf和一个用来添加解码消息的List。 对decode方法的调用会重复进行,直至确认没有新元素被添加到该List或ByteBuf没有可读字节为止。最后,如果List不为空, 那么它的内容会被传递给ChannelPipeline中的下一个ChannelInboundHandler。

下面是ByteToMessageDecoder的编程模型:

public class ToIntegerDecoder extends ByteToMessageDecoder //扩展ByteToMessageDecoder
{  @Overridepublic void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out)throws Exception {//检查ByteBuf是否仍有4个字节可读if (in.readableBytes() >= 4) {  out.add(in.readInt());  //从ByteBuf读取消息到List中}}
}

上面这种编程模式很简单,但是在读取ByteBuf之前验证其是否可读的步骤显得有些多余,所以可以使用ReplayingDecoder 来解决这个问题。

ReplayingDecoder

ReplayingDecoder扩展了ByteToMessageDecoder,这使得我们不再需要检查ByteBuf,因为ReplayingDecoder 自定义了ByteBuf的实现:ReplayingDecoderByteBuf,这个包装后的ByteBuf在内部会自动检查是否可读。以下是 ReplayingDecoderByteBuf的内部实现:

虽然ReplayingDecoderByteBuf可以自动检查可读性,但是对于某些操作并不支持,会抛出 UnsupportedOperationException异常。其编程模型如下:

public class ToIntegerDecoder2 extends ReplayingDecoder<Void> //扩展ReplayingDecoder
{@Overridepublic void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out)throws Exception {out.add(in.readInt());//从ByteBuf读取消息到List中}
}

MessageToMessageDecoder

MessageToMessageDecoder用于将一种类型的消息解码另一种类型的消息,如从DTO转为POJO。 这是MessageToMessageDecoder的原型:

public abstract class MessageToMessageDecoder<I> extends ChannelInboundHandlerAdapter

MessageToMessageDecoder的泛型I定义了我们转换何种类型的参数。 和ByteToMessageDecoder一样,自定义MessageToMessageDecoder的解码器也需要实现其decode方法。

以下是它的编程模型:

public class IntegerToStringDecoder extendsMessageToMessageDecoder<Integer>
{@Overridepublic void decode(ChannelHandlerContext ctx, Integer msg, List<Object> out)throws Exception{out.add(String.valueOf(msg));}
}

编码器

在Netty中,编码器是ChannelOutboundHandler的实现,即处理出站数据。 编码器同样分为两种:

  • 将消息编码为字节: MessageToByteEncoder。
  • 将消息编码为消息: MessageToMessageEncoder。

MessageToByteEncoder

MessageToByteEncoder用于将消息编码为字节,如果我们需要自定编码器,就需要继承它并实现它的encode方法。 encode方法是自定义编码器必须实现的方法,它被调用时会传入相应的数据和一个存储数据的ByteBuf。 在encode被调用之后,该ByteBuf会被传递给ChannelPipeline中下一个ChannelOutboundHandler。

以下是MessageToByteEncoder的编程模型:

public class ShortToByteEncoder extends MessageToByteEncoder<Short> //扩展MessageToByteEncoder
{  @Overridepublic void encode(ChannelHandlerContext ctx , Short data, ByteBuf out)throws Exception {out.writeShort(data);//将data写入ByteBuf   }
}

MessageToMessageEncoder

MessageToMessageEncoder用于将一种类型的消息编码另一种类型的消息,其原型和 MessageToMessageDecoder相似,所以这里也不再细说。

编解码器

上面的内容讲的是单独的编码器和解码器,编码器处理出站数据,是ChannelOutboundHandler的实现, 解码器负责处理入站数据,是ChannelInboundHandler的实现。除了编码器和解码器,Netty还提供了集编码与解码 于一身的编解码器ByteToMessageCodec和MessageToMessageCodec,它们同时实现了ChannelInboundHandler和ChannelOutboundHandler,其结构如下:

虽然使用编码解码器可以同时编码和解码数据,但这样不利于代码的可重用性。 相反,单独的编码器和解码器最大化了代码的可重用性和可扩展性,所以我们应该优先考虑分开使用二者。

【Netty】什么是编码器和解码器?相关推荐

  1. Netty之自定义编码器MessageToMessageEncoder类

    1.对于MessageToMessageEncoder的理解 MessageToMessageEncoder编码器,这里的第二个Message可以理解为任意一个对象.如果是使用ByteBuf对象的话, ...

  2. Netty 支持哪些常用的解码器?

    之前我们介绍了 TCP 拆包/粘包的问题,以及如何使用 Netty 实现自定义协议的编解码.可以看到,网络通信的底层实现,Netty 都已经帮我们封装好了,我们只需要扩展 ChannelHandler ...

  3. seq2seq编码器和解码器:TensorFlow实现

    seq2seq编码器和解码器 1. 什么是seq2seq 2. 编码器 3. 解码器 4. 训练模型 5. seq2seq模型预测 5.1 贪婪搜索 5.2 穷举搜索 5.3 束搜索 6. Bleu得 ...

  4. 直播实录 | 哈工大博士生周青宇:从编码器与解码器端改进生成式句子摘要

    本文为 3 月 15 日,哈工大-微软联合培养博士生--周青宇博士在第 25 期 PhD Talk 中的直播分享实录. 3 月 15 日晚,PaperWeekly 再度联合微软亚洲研究院带来了第 25 ...

  5. 今晚直播 | 从编码器与解码器端改进生成式句子摘要

    「PhD Talk」是 PaperWeekly 的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和交流可能会让知识的传播更加有意义 ...

  6. 直播预告 | 从编码器与解码器端改进生成式句子摘要

    「PhD Talk」是 PaperWeekly 的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和交流可能会让知识的传播更加有意义 ...

  7. 图片的描述生成任务、使用迁移学习实现图片的描述生成过程、CNN编码器+RNN解码器(GRU)的模型架构、BahdanauAttention注意力机制、解码器端的Attention注意力机制

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...

  8. 基于Transformer的文本情感分析编程实践(Encoder编码器-Decoder解码器框架 + Attention注意力机制 + Positional Encoding位置编码)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...

  9. 机器翻译 MXNet(使用含注意力机制的编码器—解码器,即 Encoder编码器-Decoder解码器框架 + Attention注意力机制)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...

最新文章

  1. Strict Mode (JavaScript)
  2. 嵌入式ARM Linux开发板自启动,跳过输入root用户名和密码
  3. NLP分析小说人物关系,找找主人公的真爱。
  4. WinForm绘制直线、曲线、矩形、椭圆、圆弧
  5. 富文本编辑器的配置使用
  6. 查网站服务器ip 被k,网站被K的排查方法
  7. Yarn管理界面中各个参数和yarn-site.xml中参数的对应关系
  8. 关联规则java代码_重量挖掘关联规则挖掘方法,哪个大神可以将以下伪代码转换为Java代码?...
  9. win7如何删除mariadb
  10. python是什么 自学-自学Python会有什么困难?老男孩自学python编程
  11. CKEditor设置背景图片及宽高
  12. 数据结构之线性表学习一
  13. UVAOJ1586题解
  14. Lunar Pro for Mac v5.2.2 – 实用的外接显示器屏幕亮度调节工具
  15. 为什么世界上最好的语言是php,我们来谈谈PHP为什么是世界上最好的语言?
  16. png图片转换为ico图标
  17. BING搜索引擎技巧
  18. wamp mysql 远程访问_wamp远程登录配置步骤
  19. 配音软件哪个好?这三款很火的配音软件,简直是短视频后期配音必备
  20. 【Unity】U3D ARPG游戏制作实例(一)EasyTouch5完整示例

热门文章

  1. CEJ:西安理工赵亚乾组冠状病毒在水中传播特征、可能遏制策略与研究挑战
  2. Microbiome:扩增子检测环境样本单细胞真核生物和寄生虫的新方法
  3. Plant J:细菌挥发性物质和光合信号激活低铁响应途径
  4. Microbiome:16S扩增子测序研究中定量变异和生物量影响
  5. R语言使用coin包应用于独立性问题的置换检验(permutation tests)、使用普通cor.test函数和置换近似spearman_test函数、检验变量的相关性的显著性
  6. 机器学习数据预处理之缺失值:后向填充
  7. R构建岭回归模型(Ridge Regression)实战
  8. R假设检验之Grubbs异常检测(Grubbs’ Test)
  9. 有序标称变量(Categorical Features)编码为数值变量(Continuous Features​​​​​​​)详解及实践
  10. 影像组学视频学习笔记(22)-从atlas抠出想要的ROI做成mask文件、Li‘s have a solution and plan.