一、前言
前面已经学习完了Netty框架中的主要组件,接着学习codec框架。
二、codec框架
每个网络应用程序必须定义如何将在对等体之间传输的原始字节解析并转换为目标程序的数据格式,这种转换逻辑有codec处理,其由编码器和解码器组成,每个编码器和解码器将字节流从一种格式转换到另一种格式。若将消息视为具有特定意义的结构化字节序列,那么编码器将该消息转换成适合于传输的格式(很可能是字节流),反之,解码器将网络流转换回应用程序的消息格式,然后,编码器处理出站数据,解码器处理入站数据。
2.1 解码器
解码器类涵盖两个不同的使用用例。
· 将字节解码为消息 - ByteToMessageDecoder和ReplayingDecoder。
· 将一个消息类型解码为另一个 - MessageToMessageDecoder。
解码器负责将入站数据从一种格式转换到另一种格式,所以Netty的解码器实现了ChannelInboundHandler接口。当需要在ChannelPipeline中为下一个ChannelInboundHandler转换入站数据时需要使用解码器。由于Netty支持代码模块化和重用,因此可以链接多个解码器来实现任意复杂的转换逻辑。
1. ByteToMessageDecoder抽象类
从字节到消息(或另一个字节序列)的解码是一个常见的任务,Netty使用ByteToMessageDecoder抽象类完成该任务,由于无法知道远程对等体是否一次发送完整的消息,因此该类会缓冲入站数据,直到所有待处理的数据已经准备好。
假设你收到一个包含简单int的字节流,每个int都要单独处理。 此时将从入站ByteBuf读取每个int,并将其传递给下一个ChannelInboundHandler。而为解码字节流,需要扩展ByteToMessageDecoder(当int添加到List时,它将自动装箱到Integer类型),整个过程如下图所示。
一次从ByteBuf中读取四个字节解析成一个int类型,并添加到List中,当读取完成后,将会被传递至下个ChannelHandler中,下面是ToIntegerDecoder的源代码。
延伸阅读
学习是年轻人改变自己的最好方式