Netty源碼分析第6章(解碼器)---->第2節: 固定長度解碼器

 

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循環的方式, 繼續進行解碼

這樣, 就是實現了固定長度的解碼工做

 

上一節: ByteToMessageDecoder

下一節: 行解碼器

相關文章
相關標籤/搜索