精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲私人影院| 精品久久ai| 亚洲欧美日韩在线| 肥熟一91porny丨九色丨| 偷偷操不一样的久久| 西野翔中文久久精品国产| 91福利资源站| 成人国产在线看| 你懂的视频在线免费| 激情综合亚洲精品| 亚州精品天堂中文字幕| 亚洲不卡的av| 欧美男男freegayvideosroom| 色狠狠av一区二区三区| 久久男人资源站| 国产在线观看高清视频| 粉嫩av一区二区三区在线播放| 5566日本婷婷色中文字幕97| 久久久久久久久久97| 免费福利视频一区| 91麻豆精品国产91久久久久久 | 色又黄又爽网站www久久| 最新国产精品久久| 黄色片在线免费观看| 成人精品视频.| 91精品国产综合久久香蕉922| 久久久午夜影院| 欧美一区二区三区久久精品茉莉花 | 999久久久久久| 噜噜噜在线观看免费视频日韩| 欧美大码xxxx| 999精品在线视频| 狠狠综合久久av一区二区蜜桃| 亚洲精品一区二区三区精华液| 亚洲精品成人在线播放| 素人一区二区三区| 91久久香蕉国产日韩欧美9色| 欧美狂野激情性xxxx在线观| 老司机在线视频二区| 久久精品人人做人人爽97 | 精品久久影院| 国产丝袜高跟一区| 日本一区二区在线免费观看| 亚洲精品一区国产| 日韩视频免费直播| 无套白嫩进入乌克兰美女| 日韩av黄色| 欧美日韩国产经典色站一区二区三区 | 精品国产99久久久久久| 国产精品女主播在线观看| 日本视频一区二区在线观看| 精品欧美不卡一区二区在线观看 | 日韩av一区二区在线影视| 欧美亚洲国产另类| 五月天婷婷久久| 久久国产精品久久久久久电车| 欧美性受xxx| 亚洲黄色免费观看| 模特精品在线| 国产成人自拍视频在线观看| 日本中文字幕在线观看视频| 老色鬼久久亚洲一区二区| 日本精品一区二区三区在线播放视频 | 国产人妻精品午夜福利免费| 波多野结衣在线一区二区| 精品少妇一区二区三区视频免付费| 色欲无码人妻久久精品| 2021年精品国产福利在线| 欧美www视频| 波多野结衣影院| 免费看日本一区二区| 亚洲无av在线中文字幕| 在线观看亚洲大片短视频| 久久亚洲影视| 欧美激情成人在线视频| 国产精品成人国产乱| 国产欧美丝祙| 国产精品第一视频| 国产精品伊人久久| av电影一区二区| 日本欧美色综合网站免费| 在线免费观看黄| 亚洲一区二区三区不卡国产欧美 | 奇米色777欧美一区二区| 国产精品网红直播| 亚洲黄色在线观看视频| 久久久欧美精品sm网站| 黄色高清视频网站| 三级在线观看视频| 欧美日韩免费在线视频| 亚洲熟女一区二区| 久久精品国产大片免费观看| 欧美日韩国产91| 人人妻人人爽人人澡人人精品| 久草热8精品视频在线观看| 国产亚洲福利社区| 8888四色奇米在线观看| 亚洲国产精品久久久久婷婷884| 农村妇女精品一二区| 成人激情久久| 亚洲性视频网站| 久久精品www| 日本aⅴ精品一区二区三区| 国产女主播一区二区| h视频在线观看免费| 亚洲成人免费视| 天堂中文av在线| 国产欧美日韩影院| 国产综合在线视频| 国产裸体无遮挡| 国产喂奶挤奶一区二区三区| 激情五月婷婷六月| 99久久999| 亚洲欧美另类国产| 久久久久无码国产精品不卡| 免费成人av在线播放| 精品国产电影| 四虎影视国产在线视频| 欧美午夜一区二区三区| 熟女丰满老熟女熟妇| 亚洲精品888| 国产精品美女久久| 免费播放片a高清在线观看| 亚洲综合激情网| 欧美国产在线一区| 欧美国产一级| 国产精品久久999| 欧美高清电影在线| 亚洲mv在线观看| 香蕉视频免费网站| 在线中文字幕第一区| 国产精品一区二区三区成人| 好男人免费精品视频| 欧美日韩亚洲高清| 黄色免费看视频| 红桃视频亚洲| av色综合网| 女同一区二区免费aⅴ| 69堂成人精品免费视频| 中文字幕91视频| 日本在线不卡视频| 色婷婷精品国产一区二区三区| 日韩电影毛片| 亚洲免费视频网站| 国产精品久久久久久久久久精爆| 成人午夜av电影| 97在线国产视频| 国产成人av毛片| 91国产精品91| 欧美成人综合在线| 91成人在线免费观看| 久久久无码人妻精品一区| 久久国产88| 亚洲第一综合| 2019中文亚洲字幕| 久久91精品国产91久久跳| 精品黑人一区二区三区国语馆| 亚洲人xxxx| jjzz黄色片| 亚洲免费观看| 欧美日韩亚洲综合一区二区三区激情在线| 亚洲人体影院| 中文在线资源观看视频网站免费不卡| 最近中文字幕在线观看视频| 国产精品欧美极品| 永久看看免费大片| 亚洲国产清纯| 日本在线观看一区二区三区| 欧美视频第一| 欧美人成在线视频| 色哟哟中文字幕| 91久久精品网| 尤物在线免费视频| 不卡在线视频中文字幕| 北条麻妃av高潮尖叫在线观看| 日韩一区亚洲二区| wwwxx欧美| 欧美理论影院| 久久亚洲私人国产精品va| 色综合免费视频| 欧美性xxxxxxxx| 国产网友自拍视频| 中文字幕的久久| 18深夜在线观看免费视频| 国产视频欧美| 激情五月五月婷婷| 日韩大胆成人| 成人有码在线播放| 日韩精品av| 久久成年人免费电影| 午夜视频福利在线| 91麻豆精品国产91久久久使用方法 | 亚洲自拍偷拍一区| 中文字幕在线直播| 美女视频黄免费的亚洲男人天堂| 亚洲色图21p| 91精品国产一区二区三区香蕉| 日韩aaaaaa| 亚洲色图一区二区三区| 在线 丝袜 欧美 日韩 制服| 国产经典欧美精品| 男女视频一区二区三区| 亚洲视频综合| 超碰成人在线免费观看| 亚洲影院天堂中文av色| 97中文在线观看| 欧美日韩免费电影| 日韩av手机在线| 超黄网站在线观看| 久久精品国产99国产精品澳门| 欧美日韩在线精品一区二区三区激情综| 欧美一区二区三级| 国产成人a v| 狠狠色狠色综合曰曰| 欧美日韩在线国产| 中文字幕在线一区二区三区| 黄免费在线观看| 91视视频在线观看入口直接观看www| 亚洲天堂国产视频| 日本va欧美va精品| 欧美在线观看视频网站| 中文亚洲字幕| 97视频在线免费| 欧美精品九九| www.-级毛片线天内射视视| 欧美日韩中文一区二区| 六十路精品视频| 精品在线网站观看| 国产a一区二区| 一区视频网站| 成人免费淫片aa视频免费| 欧美黑粗硬大| 国产精品日韩专区| 日本在线视频一区二区| 国产精品成人观看视频国产奇米| 美女搞黄视频在线观看| 性色av一区二区三区| free性欧美| 久久人人爽人人爽人人片av高请| 欧美aaaaaaa| 国自在线精品视频| а√天堂中文在线资源8| 欧美激情一区二区三级高清视频| 成人直播在线| 美女av一区二区| 青青青国内视频在线观看软件| 久热爱精品视频线路一| 黄a在线观看| 美乳少妇欧美精品| 丝袜在线视频| 国内免费精品永久在线视频| av在线网页| 91精品国产免费久久久久久| 日韩激情电影免费看| 日本精品视频在线| 成人国产网站| 成人欧美一区二区三区在线| 国产麻豆一区二区三区| 97神马电影| 久久夜色精品国产噜噜av小说| 另类小说综合网| heyzo久久| 国产精品jizz在线观看老狼| 欧美1区2区3区| 日韩精品―中文字幕| 久久在线精品| 手机版av在线| 成人激情小说网站| 亚洲人成人无码网www国产| 国产精品美女视频| 久久艹精品视频| 色94色欧美sute亚洲线路一久| 一本色道久久综合无码人妻| 欧美变态tickling挠脚心| 亚洲色图 校园春色| 深夜福利一区二区| 毛片在线导航| 国产精品福利小视频| 美女日韩一区| 欧美影视一区二区| 91亚洲一区| 日韩精品 欧美| 美女www一区二区| 中文字幕99页| 国产日韩欧美电影| 免费视频一二三区| 欧美综合亚洲图片综合区| 国产视频在线免费观看| 日韩国产在线看| 激情影院在线观看| 欧美中文字幕视频在线观看| 亚洲国产91视频| 九九九九精品| 91久久久精品国产| 黄色国产精品视频| 国产精品99久久不卡二区| 国产真实乱人偷精品人妻| 亚洲精品一二三四区| 日韩中文字幕高清| 精品sm在线观看| 日本不卡三区| 日本a级片电影一区二区| 日韩欧美激情电影| 亚洲精品中文字幕在线| 亚洲精品乱码| 香蕉网在线视频| 中文字幕中文字幕一区| 好看的av在线| 精品国产91久久久久久久妲己 | 国产精品成人一区二区三区夜夜夜| 久久精品国产亚洲AV无码麻豆 | 三区四区不卡| 成人在线免费观看av| 国产风韵犹存在线视精品| 黄色国产在线播放| 色999日韩国产欧美一区二区| 亚洲乱色熟女一区二区三区| 日韩最新在线视频| 制服诱惑亚洲| 欧美精品一区二区三区久久| 亚洲免费精品| 老熟女高潮一区二区三区| 亚洲人成亚洲人成在线观看图片| 波多野结衣视频观看| 精品丝袜一区二区三区| xxxx成人| 国产精品对白刺激久久久| 久久看人人摘| 男女视频在线看| 国产喂奶挤奶一区二区三区| 69国产精品视频免费观看| 日韩成人av在线播放| 福利小视频在线| 草莓视频一区| 欧美日韩三级| 亚洲精品久久一区二区三区777| 中文字幕欧美一区| 一级α片免费看刺激高潮视频| 亚洲区一区二区| 亚洲成人看片| 日韩aⅴ视频一区二区三区| 日韩电影在线免费| 亚洲黄色网址大全| 欧美日韩国产影片| 乱人伦中文视频在线| 成人午夜两性视频| 欧美一区在线看| 久久精品无码专区| 婷婷综合在线观看| 久久手机免费观看| 国产精品美乳一区二区免费| 99久久夜色精品国产亚洲96 | 色老头在线视频| 一本色道久久综合狠狠躁篇怎么玩| 欧洲精品一区二区三区| 亚洲国产婷婷香蕉久久久久久99| 秋霞国产午夜精品免费视频| 一区二区三区在线播放视频| 在线电影院国产精品| 污网站在线免费看| 国产呦系列欧美呦日韩呦| 亚洲主播在线| 长河落日免费高清观看| 日韩一区和二区| 超碰在线视屏| 日韩在线三区| 国产精品一区二区无线| 久久精品久久国产| 国产视频久久网| 亚洲一区二区av| 九九久久九九久久| av亚洲精华国产精华精华 | 日本在线播放一区二区三区| 欧美一级片在线视频| 精品国产免费一区二区三区四区 | 国产女人18毛片水真多18| 欧美日韩在线看| 日本不卡三区| 激情五月综合色婷婷一区二区| 老牛嫩草一区二区三区日本| 黄色录像免费观看| 亚洲精品美女久久久久| 97精品国产99久久久久久免费| 中文字幕精品在线播放| 97久久超碰国产精品电影| 在线免费观看一区二区| 欧美黑人一区二区三区| 国产亚洲一卡2卡3卡4卡新区| 99re6在线观看| 午夜精品久久久久久久99樱桃| eeuss影院www在线观看| 国产99视频精品免费视频36| 免费观看成人鲁鲁鲁鲁鲁视频| 国产亚洲欧美久久久久| 在线成人激情视频| 久久久久97| 天堂在线精品视频| 欧美中文字幕不卡| 免费毛片b在线观看| 裸体裸乳免费看|