decoder部分:

decoder解码器是将Byte解析成为List的Java pojo对象。所有netty中的解码器,都是Inbound入站处理器类型,
都直接或者间接实现了ChannelInboundHandler接口。
每个解码器都是一个InboundHander

decoder–>ByteToMessageDecoder解码器

该类是个抽象类,不可直接使用

它会将上一站传过来的ByteBuf中的数据进行解码,解码出一个List,然后迭代List 列表
逐个将Java POJO对象传入下一个Inbound入站处理器,

其中解码的方法 decoder是个抽象方法,由子类实现。

decoder–>ReplayingDecoder类

ReplayingDecoder 类是ByteToMessageDecoder的子类,作用:

  • 在读取ByteBuf缓冲区的数据之前,需要检查缓冲区中是否有足够的字节
  • 若ByteBuf中有足够的字节,则会正常读取,如果没有足够的字节,则会停止解码,会留着数据,等待下一次IO事件再读取。

ReplayingDecoder分包解码器:
在netty中进行字符串的传输,可以采用普通的Header-Content内容传输协议:

  • Header 部分放置字符串的长度,用int来描述

  • content部分用来放置字符串。
    在实际的传输过程中,一个Header-content内容包,在发送端会被编码成为一个ByteBuf内容发送包,
    当到达接收端后,可能被分成很多ByteBuf接收包,对于这个参差不齐的接收包,该解码器操作:

  • 1:解码出这个字符串的长度

  • 2:校验ByteBuf缓冲区的字节长度等于头部的解析的字符串长度,才会读取ByteBuf缓冲区的字节。

不适用场景:
在数据解析逻辑复杂的应用场景,ReplayingDecoder在解析速度上相对较差
原因:在ByteBuf中的长度不够时,ReplayingDecoder会抛出一个ReplayError异常,这时,会把ByteBuf中的
读指针还原到之前所在的位置。然后等待下一次IO事件,再继续解析。这对CPU是一个较大的负担。

decoder–>MessageToMessageDecoder:


在上图中,出站类型是Object,那么在下一个Inbound节点的入站类型,就是Object,这时,就需要用到MessageToMessageDecoder,
入参需要明确。

netty开箱即用的内置解码器:

  • FixedLengthFrameDecoder(固定长度数据包解码器):
    适用场景:每个数据包的长度都是固定的,例如:100个字节。
    只要把这个解码器加入到流水线中,就会把入站的ByteBuf包解析成一个个长度为100的数据包,然后进入下个Inbound节点

  • LineBaseFrameDecoder(行分割数据包解码器):
    适用场景:每个ByteBuf数据包,适用换行符(或者回车换行符)作为数据包的边界分隔符。

  • DelimiterBaseFrameDecoder(自定义分隔符数据包解码器):可以自定义分隔符。

  • LengthFieldBaseFrameDecoder(自定义长度数据包解码器):可以自定义长度(最为复杂)

Encoder:

Encoder是将Java POJO对象转化成最终的ByteBuf二进制类型。通过流水线写入到低层的Java通道。
在netty中,编码器是一个Outbound出站处理器。
编码器是将上一站输入的数据进行编码或者格式转化,传递到下一个ChannelOutBoundHander出站处理器

Encode 有MessageToByteEncoder编码器接口和MessageToMessageEncoder编码器接口

总结

在一个channelPipeline中有N个handler节点,每一个Hander都有入站(Inbound)和出站(Outbound) 出站操作
所以Decoder和Encoder是在相互配合使用的。

前面的都是Decoder和Encoder分开实现的。Netty通过继承ByteToMessageDecoder和MessageToByteEncoder或子类,
生成了一个新类型:Codec类型。同时具备解码和编码功能。

ByteToMessageCodec(继承方式):通过继承,将解码和编码结合,将前面的decoder和encoder方法放在同一个自定义类中。
本来放入channelPipeline中需要添加2个节点,现在添加1个节点即可。

CombinedChannelDuplexHander组合器(通过组合的方式):将编码器和解码器的所有的逻辑强制性的放在同一个类中,
在只需要编码和解码的流水线上,逻辑太臃肿,不大合适。这里将解码器和编码器结合起来使用,捆绑使用,更加的灵活。

12、Decoder解码器和Encoder编码器相关推荐

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

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

  2. Pytorch:Transformer(Encoder编码器-Decoder解码器、多头注意力机制、多头自注意力机制、掩码张量、前馈全连接层、规范化层、子层连接结构、pyitcast) part1

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

  3. 基于Seq2Seq的中文聊天机器人编程实践(Encoder编码器-Decoder解码器框架 + Attention注意力机制)

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

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

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

  5. Encoder编码器、Decoder解码器

    知乎用户对编码器解码器的理解 Encoder: 本身其实就是一连串的卷积网络.该网络主要由卷积层,池化层和BatchNormalization层组成. 卷积层负责获取图像局域特征,池化层对图像进行下采 ...

  6. NVIDIA PureVideo Decoder解码器注册码

    http://www.amznz.com/nvidia-purevideo-decoder/ 重装系统后当然得装终极解码来看高清电影,这次为了给喜欢看HD影片的朋友,特意奉上NVIDIA7以上显卡的N ...

  7. 【Pytorch项目实战】之生成式网络:编码器-解码器、自编码器AE、变分自编码器VAE、生成式对抗网络GAN

    文章目录 博主精品专栏导航 生成式网络 - 生成合成图像 算法一:编码器-解码器 算法二:自编码器(Auto-Encoder,AE) 算法三:变分自编码器(Variational Auto Encod ...

  8. STM32CUBEMX F103 HAL库开发 两路定时器的Encoder编码器模式

    机器人开发过程中,对于直流电机来说,编码器至关重要,它不仅可以使我们对电极进行精确的速度闭环,位置闭环,还可以通过时间积分,根据运动学关系,获得速度.位置等信息 STM32的定时器有编码器模式,大大的 ...

  9. NLP-生成模型-2014:Seq2Seq【缺点:①解码器无法对齐编码器(Attention机制);②编码器端信息过使用或欠使用(Coverage机制);③解码器无法解决OOV(Pointer机制)】

    <原始论文:Sequence to Sequence Learning with Neural Networks> Seq2Seq(多层LSTM-多层LSTM)+Attention架构是T ...

  10. 深度学习论文阅读:Generative Pre-Training(GPT)

    文章目录 GPT Abstract 1 Introduction 6 Conclusion 2 Related Work 3 Framework 3.1 Unsupervised pre-traini ...

最新文章

  1. alt+shift+j,添加日期、作者等
  2. iOS获取webView的内容或修改网页上的内容
  3. [转]iOS为UILabel添加长按复制功能
  4. Java设计模式之行为型:解释器模式
  5. 【译文】领域模型的五个特征
  6. 面试 | 你说你熟悉MySql,那你就来谈谈InnoDB如何解决幻读的?
  7. java判断光标位置_Java如何知道光标的当前位置?
  8. 外卖点餐系统源码|餐饮点餐源码开发
  9. vscode下报错:No such file or directory fatal error:no input files的一种比较坑爹的可能
  10. Drill模块——孔加工与螺纹铣削
  11. java事务 深入Java事务的原理与应用
  12. buck斩波电路matlab,直流斩波电路的MATLAB建模与仿真.doc
  13. 梁宁《产品思维》之18用户体验
  14. 游戏制作人谈10大开发经验
  15. 键盘没有小键盘怎么办?怎么打开屏幕软键盘?
  16. 洛谷P3374 树状数组模版1
  17. halcon_halcon图像处理基本运算
  18. 几种常用的开发模型和测试模型
  19. 在字节跳动工作是一种怎样的体验?
  20. 行业解决方案|智慧检务:聚焦检察院工作数字化

热门文章

  1. 扔掉代码,程序员月薪达到了80000
  2. 仿小米通讯录 右侧滑动条与带动画的悬停列表实现(二)
  3. Ardunio开发实例-VCNL4010 接近度和环境光传感器
  4. 通过 BTC 联动程度判断牛熊
  5. 【JavaScript】 基础知识
  6. White自动化测试培训大纲
  7. 人生得意须尽善,人生失意亦无怨;人生一世,草木一秋,乐也,悲也,何乐而不为呢?...
  8. 地图上分成一块一块区域 高德地图_高德地图绘制区域边界线
  9. 2021-04-12——新特性Lambda表达式和Function函数式接口编程
  10. R语言字符串相关操作