精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

來聊聊 Netty 幾個開箱即用的處理器框架

開發
本文筆者通過示例結合源碼的方式介紹了 Netty 開箱即用的內置處理器類,希望對你有幫助。

本篇文章我們將基于Netty幾個開箱即用的封裝快速落地一個易于拓展與維護的客戶端服務端通信示例,希望對你有所幫助。

基于Netty快速落地自定義協議消息通信

1.提出需求

我們需要使用Netty快速落地一套客戶端和服務端系統通信程序,客戶端會在與服務端建立連接后發送自定義協議的登錄包,然后服務端完成校驗之后返回自定義協議的登錄處理結果:

2.服務端設計與實現

按照我們以往的處理器邏輯,對于服務端我們可能會編寫一個處理器handler,其內部負責:

  • 對收到的數據包解碼。
  • 根據數據包類型走不同的if-else邏輯。
  • 回復相應的加密后的數據包。

這種做法將編碼、解碼、數據邏輯全部耦合在一個處理器上,違背了單一職責的設計,導致代碼臃腫,后續的功能的拓展和維護都十分不便。

對此本文做法是針對不同數據包指定相應處理器,通過pipeline自帶的責任鏈模式將這些處理器串聯起來,并將編碼和解碼的handler單獨抽離出來維護:

因為客戶端會向服務端發送登錄包,對應文件編碼規則為:

  • 第一個整形位,設置為登錄包類型為1。
  • 第二個整型為設置為登錄包數據長度。
  • 第三個字節數組設置為序列化后的數據包。

所以我們解碼的邏輯為:

  • 獲取4個字節知曉類型。
  • 獲取4個字節解析長度。
  • 讀取對應長度的字節數組將其反序列化為對應類型的數據包。

而Netty也為我們解碼的邏輯提供了一個類MessageToMessageDecoder,我們只需繼承并重寫其decode方法,將bytebuf解碼后的結果傳入out列表中即可傳播到對應的處理器上:

對此我們給出解碼器的處理器Handler的邏輯,可以看到該解碼器會按照編碼的要求進行解析:

public class ServerDecodeHandler extends MessageToMessageDecoder<ByteBuf> {
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
        //獲取消息類型
        int type = msg.readInt();
        if (type == 1) {
            //獲取實際消息長度
            int length = msg.readInt();
            //讀取數據并反序列化
            byte[] data = new byte[length];
            msg.readBytes(data);
            LoginPacket loginPacket = JSON.parseObject(data, LoginPacket.class);
            out.add(loginPacket);
        }


    }
}

消息被解碼器解碼之后,就可以傳播到對應業務處理器上,為了保證讀取到不同的消息被不同業務處理器處理,Netty提供了一個開箱即用的讀消息處理器,它會根據我們的指定的泛型為數據包進行匹配,只有與泛型類一致才會進行處理:

所以我們的認證處理器AuthHandler 繼承SimpleChannelInboundHandler并指明泛型LoginPacket專門處理讀取到的LoginPacket:

public class AuthHandler extends SimpleChannelInboundHandler<LoginPacket> {
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, LoginPacket msg) throws Exception {
        //如果用戶名和密碼一致則通過loginResp發送一個hello包,反之回復發送失敗
        if (msg.getUserName().equals("user") && msg.getPassword().equals("123456")) {
            LoginRespPacket loginRespPacket = new LoginRespPacket();
            loginRespPacket.setType(2);
            loginRespPacket.setMessage("hello netty client");
            ctx.writeAndFlush(loginRespPacket);
        } else {
            LoginRespPacket loginRespPacket = new LoginRespPacket();
            loginRespPacket.setType(2);
            loginRespPacket.setMessage("login failed");
            ctx.writeAndFlush(loginRespPacket);
        }
    }
}

該處理器匹配消息包的邏輯我們可以通過源碼進行簡單介紹,當解碼后的數據包通過pipeline傳播來到AuthHandler 時,它會調用繼承自SimpleChannelInboundHandler的channelRead方法并通過acceptInboundMessage查看這個消息類型和泛型是否一致,如果一致則會調用channelRead0最終回調到我們的channelRead0方法,而且相較于channelHandler,我們的SimpleChannelInboundHandler還會在finally語句自動按需檢查并釋放bytebuf內存:

@Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        boolean release = true;
        try {
         //判斷當前消息類類型和指明的泛型是否匹配
            if (acceptInboundMessage(msg)) {
                @SuppressWarnings("unchecked")
                I imsg = (I) msg;
                //如果匹配則直接調用我們重寫的channelRead0
                channelRead0(ctx, imsg);
            } else {
                release = false;
                ctx.fireChannelRead(msg);
            }
        } finally {
         //調用結束后還會檢查按需釋放bytebuf內存
            if (autoRelease && release) {
                ReferenceCountUtil.release(msg);
            }
        }
    }

認證處理器確定登錄包正確,則發送loginResp響應,對應的數據包也需要按照類型、長度、序列化包字符串的格式進行編碼,所以我們還需要編寫一個編碼器,同理我們還是使用Netty開箱即用的MessageToByteEncoder將編碼后數據寫到out這個bytebuf中:

public class ServerEncodeHandler extends MessageToByteEncoder<Packet> {
    @Override
    protected void encode(ChannelHandlerContext ctx, Packet msg, ByteBuf out) throws Exception {  //如果是Resp類型,則依次寫入類型、長度、序列化包到ByteBuf中
        if (msg.getType() == 2) {
            LoginRespPacket loginRespPacket = (LoginRespPacket) msg;
            out.writeInt(loginRespPacket.getType());
            byte[] bytes = JSON.toJSONBytes(loginRespPacket);
            out.writeInt(bytes.length);
            out.writeBytes(bytes);

        }
    }
}

3.客戶端設計與實現

而客戶端也和上文類型,我們先編寫一個連接激活后發送登錄包的處理器:

public class LoginHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        LoginPacket loginPacket = new LoginPacket();
        loginPacket.setUserName("user");
        loginPacket.setPassword("123456");
        ctx.writeAndFlush(loginPacket).
    }
}

然后就是編碼器,同樣是繼承MessageToByteEncoder實現:

public class ClientEncodeHandler extends MessageToByteEncoder<Packet> {


    @Override
    protected void encode(ChannelHandlerContext ctx, Packet msg, ByteBuf out) throws Exception {
        //按照類型、長度、序列化包進行編碼
        if (msg.getType() == 1) {
            LoginPacket loginPacket = (LoginPacket) msg;
            byte[] jsonBytes = JSON.toJSONBytes(loginPacket);
            out.writeInt(msg.getType());
            out.writeInt(jsonBytes.length);
            out.writeBytes(jsonBytes);
        }
    }
}

收到包后,根據第一個整型字節匹配到LoginRespPacket,將其解碼為LoginRespPacket:

public class ClientDecodeHandler extends MessageToMessageDecoder<ByteBuf> {


    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
        int type = msg.readInt();
        //如果type為2則說明是loginResp,按照類型、長度、反序列化包處理器
        if (type == 2) {
            int length = msg.readInt();
            byte[] data = new byte[length];
            msg.readBytes(data);
            LoginRespPacket loginRespPacket = JSON.parseObject(data, LoginRespPacket.class);
            out.add(loginRespPacket);
        }
    }
}

最終傳播到LoginRespHandler打印輸出:

public class LoginRespHandler extends SimpleChannelInboundHandler<LoginRespPacket> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, LoginRespPacket msg) throws Exception {
        System.out.println(JSONUtil.toJsonStr(msg));
    }
}

4.最終成果驗收

按照上述解耦的處理器完成開發之后,我們分別啟動服務端和客戶端,最終客戶端就會得到如下輸出:

{"message":"hello netty client","type":2}

由此基于Netty開箱即用的客戶端服務端通信模型完成。

責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關推薦

2021-08-31 15:53:48

Nuxt 開箱服務

2025-01-23 20:42:44

2023-01-15 20:28:32

前端圖片壓縮

2023-03-08 21:25:58

開源工具庫開箱

2022-08-08 08:29:55

圖片壓縮前端互聯網

2023-11-04 12:43:44

前端圖片參數

2021-09-26 05:41:47

基礎設施連接無線技術網絡

2025-07-10 00:00:05

開箱ApacheHertzbeat

2021-09-01 17:43:32

StreamNativ開源

2021-09-28 09:30:18

uni-appVue 3.0uniCloud

2023-01-29 07:49:57

2022-08-02 09:01:55

后臺管理模版

2011-04-14 14:55:02

超云云計算

2025-04-14 11:00:00

2015-06-30 09:49:19

管理平臺開源KVM

2013-11-01 09:37:19

Android系統架構工具

2022-01-03 18:15:35

FlaskTepHttpRunner

2025-05-15 08:35:00

2019-11-25 00:00:00

開源技術 數據
點贊
收藏

51CTO技術棧公眾號

国产91精品一区二区麻豆网站| 亚洲a视频在线| 日本精品影院| 欧美日本精品一区二区三区| 亚洲国产精品www| 99这里有精品视频| 亚洲在线国产日韩欧美| 久久精品夜夜夜夜夜久久| 日批视频免费看| 国产综合色区在线观看| 一区二区三区在线观看视频| 欧美资源一区| 国产综合在线播放| 亚洲欧洲日本mm| 中文字幕亚洲在线| 538国产视频| 欧美高清一级片| 色视频成人在线观看免| 国产一级大片免费看| 国产一二三区在线视频| 国内久久精品视频| 国产成人在线一区二区| 国产无码精品在线观看| 91精品国产福利在线观看麻豆| 色婷婷精品久久二区二区蜜臀av | 国产精品suv一区| 国产精品久久天天影视| 亚洲精品资源美女情侣酒店| 苍井空张开腿实干12次| 欧美综合影院| 欧美性感一区二区三区| 精品中文字幕av| av在线免费网站| 中文字幕欧美三区| 免费看污久久久| 欧美少妇bbw| 国产一区二区精品久久| 国产日韩专区在线| wwwwww在线观看| 免费看的黄色欧美网站| 亚州欧美日韩中文视频| 妺妺窝人体色www婷婷| 欧美电影免费观看高清| 国产亚洲视频在线| 亚洲av成人无码久久精品 | 99人久久精品视频最新地址| 美女黄色丝袜一区| 91n在线视频| 日韩精品久久| 色悠悠国产精品| 老司机福利在线观看| 国产精品一区二区三区av麻 | 国产一区二区三区四区| 日韩成人久久久| 2一3sex性hd| 久久97久久97精品免视看秋霞| 调教+趴+乳夹+国产+精品| 亚洲中文字幕无码一区二区三区 | 欧美一区二区三区久久久| 国产精品尤物| 青青久久av北条麻妃黑人| 日韩欧美中文字幕一区二区| 99在线观看免费视频精品观看| 中文字幕日韩欧美| 特级西西www444人体聚色 | 超碰在线国产97| 91成人超碰| 九色精品美女在线| 久久精品国产亚洲AV无码麻豆| 国产精品美女久久久久久不卡| 欧美日高清视频| 国产人妻精品久久久久野外| 亚洲2区在线| 日韩大陆欧美高清视频区| 欧美狂猛xxxxx乱大交3| 日韩精品欧美激情一区二区| 久久中文字幕一区| 久久亚洲成人av| 一区二区三区导航| 国产精品高清免费在线观看| 97免费观看视频| 丁香婷婷综合色啪| 欧美日韩一区二区视频在线| 午夜小视频在线| 亚洲一区二区三区四区五区黄| 午夜久久资源| 污视频在线看网站| 亚洲h在线观看| 校园春色 亚洲色图| 国产精品视频一区视频二区 | 亚洲av无码片一区二区三区| 成人av网站在线观看免费| 欧美日本国产精品| 久草免费在线观看| 亚洲动漫第一页| 亚洲综合色在线观看| 日本伊人久久| 亚洲欧美日韩精品久久| 午夜精品福利在线视频| 在线欧美亚洲| 国产欧美一区二区| 奇米精品一区二区三区在线观看| 一区二区三区四区在线播放| 欧美图片激情小说| 另类中文字幕国产精品| 日韩欧美一二三四区| ass精品国模裸体欣赏pics| 亚洲男人天堂2023| 欧美精品成人网| 欧美经典一区| 日韩精品极品视频| 亚洲欧美小视频| 秋霞影院一区二区| 好看的日韩精品| 麻豆影院在线| 在线欧美日韩国产| 精品视频站长推荐| 亚洲精品成人无限看| 国产精品成人免费视频| 亚洲乱色熟女一区二区三区| 久久久国产一区二区三区四区小说 | 999精品视频一区二区三区| 国内爆初菊对白视频| 日本一区免费视频| 成年人视频网站免费观看| 免费一级欧美在线大片| 亚洲最新中文字幕| 亚洲免费在线观看av| 国产超碰在线一区| 免费国产成人看片在线| 免费视频成人| 中文字幕精品在线| 一级久久久久久| 久久亚洲精精品中文字幕早川悠里 | 五月激情综合色| 国产精品日日摸夜夜爽| 一区二区日韩欧美| 国产精品视频在线播放| 久久精品蜜桃| 日本精品一级二级| 中文幕无线码中文字蜜桃| 国产精品久久久久毛片大屁完整版| 日本一区二区在线播放| 四虎精品成人免费网站| 午夜激情久久久| 日批视频在线看| 中文字幕日韩一区二区不卡| 亚洲综合色激情五月| 九七久久人人| 欧美剧在线免费观看网站| 国产美女高潮视频| 国内精品在线播放| 欧美xxxx吸乳| 久久gogo国模啪啪裸体| 九九热最新视频//这里只有精品| 成人午夜淫片100集| 99久久综合99久久综合网站| 亚洲自偷自拍熟女另类| 日韩大胆成人| 热99这里只有精品| 欧美极品在线| www.色综合| 人妻中文字幕一区二区三区| 一卡二卡三卡四卡| 蜜乳av综合| 日本一区二区在线播放| 二区三区在线| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 国产日本欧美在线观看| 男人的天堂在线视频免费观看 | 精品一区二区三区四区五区六区| 大奶在线精品| 国产精品麻豆欧美日韩ww| 51国产成人精品午夜福中文下载| 国产精品久久久久久久久久久久久久久久久久| 成人av在线资源| 凹凸国产熟女精品视频| 久久精品国产亚洲blacked| 97在线视频免费播放| 最近中文字幕免费观看| 91精品短视频| 欧美大片在线看| 五月婷婷六月丁香| 欧亚一区二区三区| 欧美黑人一级片| 91小视频免费观看| 日本肉体xxxx裸体xxx免费| 久久中文字幕二区| 国产精品一区二区三区在线观| 青青久在线视频免费观看| 日本韩国视频一区二区| 午夜国产福利一区二区| 99久久伊人精品| 国产视频手机在线播放| 午夜欧美理论片| 欧美久久在线| 97超碰成人| 国产精品久久久久久久久借妻| 午夜视频www| 欧美日韩免费视频| 日本三级中文字幕| 国产精品超碰97尤物18| 日韩综合第一页| 美国欧美日韩国产在线播放| 九一国产精品视频| 国产精品国产三级国产在线观看| 国产精品91在线| 不用播放器的免费av| 综合天堂av久久久久久久| 蜜桃传媒一区二区| 亚洲一级大片| 国产欧美一区二区三区在线| 白白色在线观看| 久久精品国产欧美激情| 国产玉足榨精视频在线观看| 精品三级在线看| 97久久人国产精品婷婷| 在线免费观看视频一区| 国产极品美女高潮无套嗷嗷叫酒店| 国产sm精品调教视频网站| 成人性生生活性生交12| 亚洲精品乱码| 成人午夜视频免费观看| 欧美丰满日韩| 欧美一级爱爱| 日韩mv欧美mv国产网站| 99久久综合狠狠综合久久止| 亚洲午夜剧场| 国产日韩av在线| 成人精品动漫| 国产精品欧美久久久| 精品欧美一区二区三区在线观看| 三级精品视频久久久久| 欧美伦理影视网| 日韩精品中文字幕在线观看| 好吊色一区二区| 日韩精品一区二区三区四区视频| 日本一本高清视频| 一区二区国产视频| 色哟哟一一国产精品| 国产精品久久久久久久午夜片 | yw.尤物在线精品视频| 国产91对白在线播放| 日韩大片免费观看| 欧美有码在线观看视频| 欧美伦理91| 日本午夜精品理论片a级appf发布| 秋霞午夜理伦电影在线观看| 在线国产精品播放| 91网页在线观看| 在线观看亚洲区| 日本最新在线视频| 操91在线视频| 国产探花视频在线观看| 国内精品久久影院| 僵尸再翻生在线观看| 26uuu国产在线精品一区二区| 激情五月六月婷婷| 欧美国产三级| 蜜桃传媒一区二区三区| 一区二区三区四区五区精品视频 | 精品人妻一区二区三区蜜桃视频| 国产一区二区中文字幕| www.久久com| 国产精品亚洲第一区在线暖暖韩国| 亚洲色精品三区二区一区| 日韩av一级片| 国产一级免费大片| 懂色av噜噜一区二区三区av| 国产二级一片内射视频播放| 久久久久久久久久久黄色 | av一级亚洲| 精品国产乱码久久久久久郑州公司 | 亚洲一区在线免费观看| 国产女同在线观看| 欧美亚一区二区| 99热这里只有精品在线| 日韩av网址在线观看| h视频在线播放| 九九视频直播综合网| 忘忧草在线日韩www影院| 国产不卡av在线免费观看| 日韩成人综合网| 激情视频在线观看一区二区三区| 日本精品国产| 久久久久久国产精品免费免费| 成午夜精品一区二区三区软件| 91网站免费观看| 免费成人三级| 影音先锋在线亚洲| 亚洲免费大片| 涩涩网站在线看| 99精品国产91久久久久久 | 国产又粗又猛又黄又爽| 日韩午夜激情电影| 免费av在线电影| 欧美成人国产va精品日本一级| 黄色精品免费看| 欧美在线xxx| 人人九九精品视频| 欧美日韩专区在线| 亚洲视频在线观看免费视频| 精品日韩成人av| h视频网站在线观看| 久久人人爽人人爽人人片av高请 | 国产精品久久久久久久电影| 国产精品美女久久久久| 欧美性色黄大片人与善| 国产综合自拍| 国产精品久久久久久9999| 26uuu国产日韩综合| 青娱乐av在线| 欧美三区在线观看| 深夜影院在线观看| 欧美激情中文网| 国产中文欧美日韩在线| 日韩精品无码一区二区三区| 99精品福利视频| 一区二区三区人妻| 中文字幕日本不卡| 最近中文字幕在线观看视频| 亚洲精品美女久久久| 国内老司机av在线| **亚洲第一综合导航网站| 久久影视一区| 中日韩av在线播放| 国产欧美一二三区| 在线精品免费视| 日韩成人av在线| 888av在线视频| 俄罗斯精品一区二区三区| 91成人影院| 亚洲成人手机在线观看| 国产精品麻豆一区二区| 伊人精品一区二区三区| 伊人青青综合网站| 在线看欧美视频| 玛丽玛丽电影原版免费观看1977 | 中文在线一区二区| 天干夜夜爽爽日日日日| 亚洲天堂av在线免费观看| 综合日韩av| 欧美在线视频二区| 日本vs亚洲vs韩国一区三区二区 | 涩多多在线观看| 国产精品久久久久久妇女6080| 久久免费小视频| 欧美一区二区三区免费在线看| 九色网友自拍视频手机在线| 26uuu另类亚洲欧美日本一| 视频小说一区二区| 91av在线免费播放| 欧美激情一区在线观看| 亚洲一区精品在线观看| 久久久国产成人精品| 精品一区二区三区中文字幕| 无码人妻精品一区二区蜜桃百度| 日韩专区欧美专区| 亚洲第一综合网| 666欧美在线视频| xvideos国产在线视频| 高清视频一区| 免费在线亚洲欧美| 五月婷婷六月香| 欧美一区二区啪啪| xxx性欧美| 日本高清一区| 国产乱一区二区| 97免费在线观看视频| 亚洲香蕉av在线一区二区三区| 国产直播在线| 日本一区二区三区四区高清视频 | 亚洲AV无码久久精品国产一区| 91麻豆国产精品久久| 在线视频精品免费| 色噜噜狠狠狠综合曰曰曰88av| 97se综合| 日本特级黄色大片| av激情综合网| 中国精品一区二区| 欧美男插女视频| 欧美专区视频| 爱福利视频一区二区| 亚洲欧美综合在线精品| 日韩一级片免费| 国产精品久久一区| 欧美日韩网站| 在线小视频你懂的| 日韩欧美一区二区视频| 黑人巨大亚洲一区二区久 | 亚洲日本久久| www..com.cn蕾丝视频在线观看免费版 | 国产精品一区二区6| 伊人久久免费视频| 岛国精品一区| 看欧美ab黄色大片视频免费| 亚洲午夜在线观看视频在线| aaa在线免费观看| 精品视频一区二区三区四区| 九色综合国产一区二区三区|