這里以MqttDecoder為例解析ReplayingDecoder的使用
ByteBuf是容器,里面數(shù)據(jù)可多可少
netty的數(shù)據(jù)是鏈?zhǔn)絺鬟f的
image.png
class MqttDecoder{
/**
* @param ByteBuf buffer //這個(gè)是傳遞給MqttDecoder的ByteBuf是ReplayingDecoder創(chuàng)建并持有的ByteBuf
*
**/
decode(ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out)
}
ReplayingDecoder的作用就是一個(gè)ByteBuf緩存,持續(xù)收集數(shù)據(jù)
checkPoint的作用是記錄當(dāng)前的讀index,也可以理解為清空已經(jīng)使用了的數(shù)據(jù)
下面通過(guò)流程演示下解析過(guò)程
image.png
image.png
image.png
image.png
可以看到3號(hào)包被清除了一半,ReplayingDecoder現(xiàn)在只有緩存30字節(jié),
但是READ_FIXED_HEADER已經(jīng)解析成功了,進(jìn)入READ_VARIABLE_HEADER階段螃征,后面收到的數(shù)據(jù)都喂給READ_VARIABLE_HEADER階段