Netty分布式固定長度解碼器實現(xiàn)原理剖析
固定長度解碼器
上一小節(jié):解碼器讀取數(shù)據(jù)不完整的邏輯剖析
我們了解到, 解碼器需要繼承ByteToMessageDecoder, 并重寫decode方法, 將解析出來的對象放入集合中集合, ByteToMessageDecoder中可以將解析出來的對象向下進(jìn)行傳播, 這一小節(jié)帶大家剖析一個最簡單的解碼器FixedLengthFrameDecoder, 從它入手了解碼器的相關(guān)原理
FixedLengthFrameDecoder是一個固定長度的解碼器, 功能就是根據(jù)固定長度, 截取固定大小的字節(jié)數(shù)進(jìn)行解碼
看其類的定義
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); } //保存當(dāng)前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 { //字節(jié)是否小于這個固定長度 if (in.readableBytes() < frameLength) { return null; } else { //當(dāng)前累加器中截取這個長度的數(shù)值 return in.readRetainedSlice(frameLength); } } }
我們看到這個類繼承了ByteToMessageDecoder, 重寫了decode方法
這個類只有一個屬性叫frameLength, 并在構(gòu)造方法中初始化了該屬性
再看decode方法, 在decode方法中又調(diào)用了自身另一個重載的decode方法進(jìn)行解析, 解析出來之后將解析后的數(shù)據(jù)放在集合out中
再看重載的decode方法
重載的decode方法中首先判斷累加器的字節(jié)數(shù)是否小于固定長度, 如果小于固定長度則返回null, 代表不是一個完整的數(shù)據(jù)包, 直接返回null
如果大于等于固定長度, 則直接從累加器中截取這個長度的數(shù)值
in.readRetainedSlice(frameLength) 會返回一個新的截取后的ByteBuf, 并將原來的累加器讀指針后移frameLength個字節(jié)
如果累計器中還有數(shù)據(jù), 則會通過ByteToMessageDecoder中callDecode方法里while循環(huán)的方式, 繼續(xù)進(jìn)行解碼
這樣, 就是實現(xiàn)了固定長度的解碼工作
到此這篇關(guān)于Netty分布式固定長度解碼器實現(xiàn)原理剖析的文章就介紹到這了,更多相關(guān)Netty分布式固定長度解碼器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java數(shù)組與堆棧相關(guān)知識總結(jié)
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Java數(shù)組與堆棧展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06SpringBoot整合Dubbo框架,實現(xiàn)RPC服務(wù)遠(yuǎn)程調(diào)用
Dubbo是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠(yuǎn)程方法調(diào)用,智能容錯和負(fù)載均衡,以及服務(wù)自動注冊和發(fā)現(xiàn)。今天就來看下SpringBoot整合Dubbo框架的步驟2021-06-06