这里以MqttDecoder为例解析ReplayingDecoder的使用
ByteBuf是容器,里面数据可多可少
netty的数据是链式传递的
image.png
class MqttDecoder{
/**
* @param ByteBuf buffer //这个是传递给MqttDecoder的ByteBuf是ReplayingDecoder创建并持有的ByteBuf
*
**/
decode(ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out)
}
ReplayingDecoder的作用就是一个ByteBuf缓存,持续收集数据
checkPoint的作用是记录当前的读index,也可以理解为清空已经使用了的数据
下面通过流程演示下解析过程
image.png
image.png
image.png
image.png
可以看到3号包被清除了一半,ReplayingDecoder现在只有缓存30字节,
但是READ_FIXED_HEADER已经解析成功了,进入READ_VARIABLE_HEADER阶段,后面收到的数据都喂给READ_VARIABLE_HEADER阶段
网友评论