Netty中的MessageToMessageDecoder用法2022-01-11

在《Netty實戰(zhàn)》實戰(zhàn)一書中,介紹MessageToMessageDecoder的用法時,書中給的例子是這樣的

image.png

我的實現(xiàn)

/**
 * @author frend
 * @version v0.0.1
 * @apiNote 將一種類型轉(zhuǎn)換為另外一種類型
 * 
 * @time 2022/1/10 22:59
 * @parjectName netty-demo
 */
public class IntegerToStringDecoder extends MessageToMessageDecoder<Integer> {

    protected void decode(ChannelHandlerContext ctx, Integer msg, List<Object> out)
            throws Exception {
        out.add(String.valueOf(msg));
    }
}

測試調(diào)用

    public static void main(String[] args) {
        ByteBuf buffer = Unpooled.buffer();
        for (int i = 0; i < 9 ; i ++) {
            buffer.writeInt(i);
        }
        ByteBuf in = buffer.duplicate();
        EmbeddedChannel channel = new EmbeddedChannel(new IntegerToStringDecoder());
        channel.writeInbound(in);
        channel.finish();

        System.out.println(channel.readInbound());
        System.out.println(channel.readInbound());
        System.out.println(channel.readInbound());
        System.out.println(channel.readInbound());
        System.out.println(channel.readInbound());
    }

上述代碼中鹿响,給buffer添加了0~8的數(shù)字,但是在main方法執(zhí)行后谷饿,讀取時的結(jié)果是這樣的

"C:\Program Files\Java\jdk1.8.0_171\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.2\lib\idea_rt.jar=57943:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_171\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\rt.jar;I:\dev\workspace\java\netty-demo\netty-test\target\classes;I:\dev\tools\apache-maven-3.5.3\repository\junit\junit\4.12\junit-4.12.jar;I:\dev\tools\apache-maven-3.5.3\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;I:\dev\tools\apache-maven-3.5.3\repository\io\netty\netty-all\4.1.53.Final\netty-all-4.1.53.Final.jar" org.rate.netty.decode.IntegerToStringDecoderTEst
null
null
null
null
null

經(jīng)過一番測試后發(fā)現(xiàn)惶我,MessageToMessageDecoder不能直接對ByteBuf的數(shù)據(jù)進(jìn)行處理,因此在調(diào)用 MessageToMessageDecoder的實現(xiàn)之前博投,先需要將ByteBuf轉(zhuǎn)化為一個Message
改造后的代碼

public static void main(String[] args) {
        ByteBuf buffer = Unpooled.buffer();
        for (int i = 0; i < 9 ; i ++) {
            buffer.writeInt(i);
        }
        ByteBuf in = buffer.duplicate();
        EmbeddedChannel channel = new EmbeddedChannel(new IntegerToStringDecoder());
        channel.pipeline()
                .addLast(new MyByteToMessageDecoder())
                .addLast(new IntegerToStringDecoder());
        channel.writeInbound(in);

        channel.finish();

        System.out.println(channel.readInbound());
        System.out.println(channel.readInbound());
        System.out.println(channel.readInbound());
        System.out.println(channel.readInbound());
        System.out.println(channel.readInbound());
    }

在channel的pipeline添加一個Bytebuf的前置處理器
執(zhí)行結(jié)果

"C:\Program Files\Java\jdk1.8.0_171\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.2\lib\idea_rt.jar=59697:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_171\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\rt.jar;I:\dev\workspace\java\netty-demo\netty-test\target\classes;I:\dev\tools\apache-maven-3.5.3\repository\junit\junit\4.12\junit-4.12.jar;I:\dev\tools\apache-maven-3.5.3\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;I:\dev\tools\apache-maven-3.5.3\repository\io\netty\netty-all\4.1.53.Final\netty-all-4.1.53.Final.jar" org.rate.netty.decode.IntegerToStringDecoderTEst
0
1
2
3
4
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绸贡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子毅哗,更是在濱河造成了極大的恐慌听怕,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虑绵,死亡現(xiàn)場離奇詭異尿瞭,居然都是意外死亡,警方通過查閱死者的電腦和手機翅睛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門声搁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黑竞,“玉大人,你說我怎么就攤上這事疏旨『芑辏” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵充石,是天一觀的道長莫换。 經(jīng)常有香客問我,道長骤铃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任坷剧,我火速辦了婚禮惰爬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惫企。我一直安慰自己撕瞧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布狞尔。 她就那樣靜靜地躺著丛版,像睡著了一般。 火紅的嫁衣襯著肌膚如雪偏序。 梳的紋絲不亂的頭發(fā)上页畦,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音研儒,去河邊找鬼豫缨。 笑死,一個胖子當(dāng)著我的面吹牛端朵,可吹牛的內(nèi)容都是我干的好芭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼冲呢,長吁一口氣:“原來是場噩夢啊……” “哼舍败!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起敬拓,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤邻薯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恩尾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弛说,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年翰意,在試婚紗的時候發(fā)現(xiàn)自己被綠了木人。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片信柿。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖醒第,靈堂內(nèi)的尸體忽然破棺而出渔嚷,到底是詐尸還是另有隱情,我是刑警寧澤稠曼,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布形病,位于F島的核電站,受9級特大地震影響霞幅,放射性物質(zhì)發(fā)生泄漏漠吻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一司恳、第九天 我趴在偏房一處隱蔽的房頂上張望途乃。 院中可真熱鬧,春花似錦扔傅、人聲如沸耍共。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽试读。三九已至,卻和暖如春荠耽,著一層夾襖步出監(jiān)牢的瞬間钩骇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工骇塘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伊履,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓款违,卻偏偏與公主長得像唐瀑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子插爹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容