Netty源碼分析第六章: 解碼器html
第二節: 固定長度解碼器ide
上一小節咱們瞭解到, 解碼器須要繼承ByteToMessageDecoder, 並重寫decode方法, 將解析出來的對象放入集合中集合, ByteToMessageDecoder中能夠將解析出來的對象向下進行傳播, 這一小節帶你們剖析一個最簡單的解碼器FixedLengthFrameDecoder, 從它入手瞭解碼器的相關原理源碼分析
FixedLengthFrameDecoder是一個固定長度的解碼器, 功能就是根據固定長度, 截取固定大小的字節數進行解碼this
看其類的定義:spa
public class FixedLengthFrameDecoder extends ByteToMessageDecoder { //長度大小
private final int frameLength; public FixedLengthFrameDecoder(int frameLength) { if (frameLength <= 0) { throw new IllegalArgumentException( "frameLength must be a positive integer: " + frameLength); } //保存當前frameLength
this.frameLength = frameLength; } @Override protected final void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { //經過ByteBuf去解碼.解碼到對象以後添加到out上
Object decoded = decode(ctx, in); if (decoded != null) { //將解析到byteBuf添加到對象裏面
out.add(decoded); } } protected Object decode( @SuppressWarnings("UnusedParameters") ChannelHandlerContext ctx, ByteBuf in) throws Exception { //字節是否小於這個固定長度
if (in.readableBytes() < frameLength) { return null; } else { //當前累加器中截取這個長度的數值
return in.readRetainedSlice(frameLength); } } }
咱們看到這個類繼承了ByteToMessageDecoder, 重寫了decode方法指針
這個類只有一個屬性叫frameLength, 並在構造方法中初始化了該屬性code
再看decode方法, 在decode方法中又調用了自身另外一個重載的decode方法進行解析, 解析出來以後將解析後的數據放在集合out中htm
再看重載的decode方法:對象
重載的decode方法中首先判斷累加器的字節數是否小於固定長度, 若是小於固定長度則返回null, 表明不是一個完整的數據包, 直接返回nullblog
若是大於等於固定長度, 則直接從累加器中截取這個長度的數值
in.readRetainedSlice(frameLength) 會返回一個新的截取後的ByteBuf, 並將原來的累加器讀指針後移frameLength個字節
若是累計器中還有數據, 則會經過ByteToMessageDecoder中callDecode方法裏while循環的方式, 繼續進行解碼
這樣, 就是實現了固定長度的解碼工做