Netty分布式固定長(zhǎng)度解碼器實(shí)現(xiàn)原理剖析
固定長(zhǎng)度解碼器
上一小節(jié):解碼器讀取數(shù)據(jù)不完整的邏輯剖析
我們了解到, 解碼器需要繼承ByteToMessageDecoder, 并重寫(xiě)decode方法, 將解析出來(lái)的對(duì)象放入集合中集合, ByteToMessageDecoder中可以將解析出來(lái)的對(duì)象向下進(jìn)行傳播, 這一小節(jié)帶大家剖析一個(gè)最簡(jiǎn)單的解碼器FixedLengthFrameDecoder, 從它入手了解碼器的相關(guān)原理
FixedLengthFrameDecoder是一個(gè)固定長(zhǎng)度的解碼器, 功能就是根據(jù)固定長(zhǎng)度, 截取固定大小的字節(jié)數(shù)進(jìn)行解碼
看其類的定義
public class FixedLengthFrameDecoder extends ByteToMessageDecoder {
//長(zhǎng)度大小
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 {
//通過(guò)ByteBuf去解碼.解碼到對(duì)象之后添加到out上
Object decoded = decode(ctx, in);
if (decoded != null) {
//將解析到byteBuf添加到對(duì)象里面
out.add(decoded);
}
}
protected Object decode(
@SuppressWarnings("UnusedParameters") ChannelHandlerContext ctx, ByteBuf in) throws Exception {
//字節(jié)是否小于這個(gè)固定長(zhǎng)度
if (in.readableBytes() < frameLength) {
return null;
} else {
//當(dāng)前累加器中截取這個(gè)長(zhǎng)度的數(shù)值
return in.readRetainedSlice(frameLength);
}
}
}我們看到這個(gè)類繼承了ByteToMessageDecoder, 重寫(xiě)了decode方法
這個(gè)類只有一個(gè)屬性叫frameLength, 并在構(gòu)造方法中初始化了該屬性
再看decode方法, 在decode方法中又調(diào)用了自身另一個(gè)重載的decode方法進(jìn)行解析, 解析出來(lái)之后將解析后的數(shù)據(jù)放在集合out中
再看重載的decode方法
重載的decode方法中首先判斷累加器的字節(jié)數(shù)是否小于固定長(zhǎng)度, 如果小于固定長(zhǎng)度則返回null, 代表不是一個(gè)完整的數(shù)據(jù)包, 直接返回null
如果大于等于固定長(zhǎng)度, 則直接從累加器中截取這個(gè)長(zhǎng)度的數(shù)值
in.readRetainedSlice(frameLength) 會(huì)返回一個(gè)新的截取后的ByteBuf, 并將原來(lái)的累加器讀指針后移frameLength個(gè)字節(jié)
如果累計(jì)器中還有數(shù)據(jù), 則會(huì)通過(guò)ByteToMessageDecoder中callDecode方法里while循環(huán)的方式, 繼續(xù)進(jìn)行解碼
這樣, 就是實(shí)現(xiàn)了固定長(zhǎng)度的解碼工作
到此這篇關(guān)于Netty分布式固定長(zhǎng)度解碼器實(shí)現(xiàn)原理剖析的文章就介紹到這了,更多相關(guān)Netty分布式固定長(zhǎng)度解碼器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中Class類的基礎(chǔ)知識(shí)點(diǎn)及實(shí)例
在本篇文章里小編給大家分享了關(guān)于java中Class類的基礎(chǔ)知識(shí)點(diǎn)及實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-05-05
實(shí)例解析Java日期格式工具類DateUtil.java
本文主要對(duì)Java日期格式工具類DateUtil.java進(jìn)行實(shí)例解析。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01
SpringBoot3實(shí)現(xiàn)webclient的通用方法詳解
Spring Boot WebClient 是 Spring Framework 5 中引入的一個(gè)新的響應(yīng)式 Web 客戶端,用于異步和響應(yīng)式地與外部服務(wù)進(jìn)行通信,下面我們就來(lái)看看SpringBoot3實(shí)現(xiàn)webclient的通用方法吧2024-04-04
關(guān)于@ApiImplicitParams、ApiImplicitParam的使用說(shuō)明
這篇文章主要介紹了關(guān)于@ApiImplicitParams、ApiImplicitParam的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java 數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹(shù)題集上
二叉樹(shù)可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來(lái)說(shuō),最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將帶你通過(guò)實(shí)際題目來(lái)熟練掌握2022-04-04
Java?C++題解leetcode1441用棧操作構(gòu)建數(shù)組示例
這篇文章主要為大家介紹了Java?C++題解leetcode1441用棧操作構(gòu)建數(shù)組示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
SpringCloud注冊(cè)中心之consul詳細(xì)講解使用方法
Consul是一款由HashiCorp公司開(kāi)源的,用于服務(wù)治理的軟件,Spring Cloud Consul對(duì)其進(jìn)行了封裝,這篇文章主要介紹了springcloud組件consul服務(wù)治理,需要的朋友可以參考下2022-11-11

