最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Netty分布式固定長度解碼器實(shí)現(xiàn)原理剖析

 更新時(shí)間:2022年03月29日 09:57:43   作者:向南是個(gè)萬人迷  
這篇文章主要為大家介紹了Netty分布式固定長度解碼器原理剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

固定長度解碼器

上一小節(jié):解碼器讀取數(shù)據(jù)不完整的邏輯剖析

我們了解到, 解碼器需要繼承ByteToMessageDecoder, 并重寫decode方法, 將解析出來的對象放入集合中集合, ByteToMessageDecoder中可以將解析出來的對象向下進(jìn)行傳播, 這一小節(jié)帶大家剖析一個(gè)最簡單的解碼器FixedLengthFrameDecoder, 從它入手了解碼器的相關(guān)原理

FixedLengthFrameDecoder是一個(gè)固定長度的解碼器, 功能就是根據(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é)是否小于這個(gè)固定長度
        if (in.readableBytes() < frameLength) {
            return null;
        } else {
            //當(dāng)前累加器中截取這個(gè)長度的數(shù)值
            return in.readRetainedSlice(frameLength);
        }
    }
}

我們看到這個(gè)類繼承了ByteToMessageDecoder, 重寫了decode方法

這個(gè)類只有一個(gè)屬性叫frameLength, 并在構(gòu)造方法中初始化了該屬性

再看decode方法, 在decode方法中又調(diào)用了自身另一個(gè)重載的decode方法進(jìn)行解析, 解析出來之后將解析后的數(shù)據(jù)放在集合out中

再看重載的decode方法

重載的decode方法中首先判斷累加器的字節(jié)數(shù)是否小于固定長度, 如果小于固定長度則返回null, 代表不是一個(gè)完整的數(shù)據(jù)包, 直接返回null

如果大于等于固定長度, 則直接從累加器中截取這個(gè)長度的數(shù)值

 in.readRetainedSlice(frameLength) 會(huì)返回一個(gè)新的截取后的ByteBuf, 并將原來的累加器讀指針后移frameLength個(gè)字節(jié)

如果累計(jì)器中還有數(shù)據(jù), 則會(huì)通過ByteToMessageDecoder中callDecode方法里while循環(huán)的方式, 繼續(xù)進(jìn)行解碼

這樣, 就是實(shí)現(xiàn)了固定長度的解碼工作

到此這篇關(guān)于Netty分布式固定長度解碼器實(shí)現(xiàn)原理剖析的文章就介紹到這了,更多相關(guān)Netty分布式固定長度解碼器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中Class類的基礎(chǔ)知識(shí)點(diǎn)及實(shí)例

    java中Class類的基礎(chǔ)知識(shí)點(diǎn)及實(shí)例

    在本篇文章里小編給大家分享了關(guān)于java中Class類的基礎(chǔ)知識(shí)點(diǎn)及實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-05-05
  • 一文徹底搞懂java多線程和線程池

    一文徹底搞懂java多線程和線程池

    當(dāng)一個(gè)服務(wù)器接受到大量短小線程的請求時(shí),使用線程池技術(shù)是非常合適的,它可以大大減少線程的創(chuàng)建和銷毀次數(shù),提高服務(wù)器的工作效率,這篇文章主要給大家介紹了如何通過一文徹底搞懂java多線程和線程池的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Spring容器中添加bean的5種方式

    Spring容器中添加bean的5種方式

    我們知道平時(shí)在開發(fā)中使用Spring的時(shí)候,都是將對象交由Spring去管理,那么將一個(gè)對象加入到Spring容器中,有哪些方式呢,感興趣的可以了解一下
    2021-07-07
  • 實(shí)例解析Java日期格式工具類DateUtil.java

    實(shí)例解析Java日期格式工具類DateUtil.java

    本文主要對Java日期格式工具類DateUtil.java進(jìn)行實(shí)例解析。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • java中this關(guān)鍵字的詳細(xì)使用介紹

    java中this關(guān)鍵字的詳細(xì)使用介紹

    大家好,本篇文章主要講的是java中this關(guān)鍵字的詳細(xì)使用介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • SpringBoot3實(shí)現(xiàn)webclient的通用方法詳解

    SpringBoot3實(shí)現(xiàn)webclient的通用方法詳解

    Spring Boot WebClient 是 Spring Framework 5 中引入的一個(gè)新的響應(yīng)式 Web 客戶端,用于異步和響應(yīng)式地與外部服務(wù)進(jìn)行通信,下面我們就來看看SpringBoot3實(shí)現(xiàn)webclient的通用方法吧
    2024-04-04
  • 關(guān)于@ApiImplicitParams、ApiImplicitParam的使用說明

    關(guān)于@ApiImplicitParams、ApiImplicitParam的使用說明

    這篇文章主要介紹了關(guān)于@ApiImplicitParams、ApiImplicitParam的使用說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java 數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹題集上

    Java 數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹題集上

    二叉樹可以簡單理解為對于一個(gè)節(jié)點(diǎn)來說,最多擁有一個(gè)上級節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將帶你通過實(shí)際題目來熟練掌握
    2022-04-04
  • Java?C++題解leetcode1441用棧操作構(gòu)建數(shù)組示例

    Java?C++題解leetcode1441用棧操作構(gòu)建數(shù)組示例

    這篇文章主要為大家介紹了Java?C++題解leetcode1441用棧操作構(gòu)建數(shù)組示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • SpringCloud注冊中心之consul詳細(xì)講解使用方法

    SpringCloud注冊中心之consul詳細(xì)講解使用方法

    Consul是一款由HashiCorp公司開源的,用于服務(wù)治理的軟件,Spring Cloud Consul對其進(jìn)行了封裝,這篇文章主要介紹了springcloud組件consul服務(wù)治理,需要的朋友可以參考下
    2022-11-11

最新評論

西昌市| 隆德县| 吴川市| 中西区| 正镶白旗| 攀枝花市| 于都县| 南江县| 嵊泗县| 武冈市| 宁津县| 桐柏县| 乐陵市| 抚远县| 措美县| 阳曲县| 肃南| 玉门市| 尼勒克县| 嘉兴市| 仙游县| 西乡县| 江西省| 宁阳县| 郑州市| 安福县| 弥勒县| 江永县| 即墨市| 城市| 白玉县| 安平县| 台前县| 恭城| 宜宾市| 施秉县| 博湖县| 涡阳县| 宜兴市| 宁国市| 南丰县|