記一次netty客戶端的開發

背景

近日要開發一個tcp客戶端程序去對接上游廠商的數據源,決定使用netty去處理,由于很久沒有開發過netty了,順便學習記錄下

netty搭建

考慮到我們需要多個client去對接server服務,所以我們定義一個公共的AbstractNettyClient父類,定義一些公共的方法,比如,連接,重試等。以達到代碼復用
我這里采用的是三層結構的設計,因為對接的上游數據廠商的不止一家,每家廠商會存在一定的定制化邏輯,所以在此進行封裝

  1. 公共的nettyClient父類,所有netty 子類繼承
  2. 具體上游廠商的父類,實現廠商對接的一些公共處理
  3. 真正實現的子類,有多少個需要對接的,就實現多少
    在這里插入圖片描述

需要哪些公共方法

對于最上層的netty,我們應該定義有哪些全局的公共方法,這里給出幾個通用示例

public void start(){// 啟動操作
}public void stop(){// 停止操作
}public void restart(){// 重啟操作
}

需要哪些Handler?

了解過netty基礎的都知道,netty中有inbound和outbound兩個出入站的鏈路處理器供我們處理接受與發送的消息,那么作為全局公共的父類,自然要提供給子類可擴展的handler自選,同時也要維護全局公共的handler,那么這里定義一個公共模板的handler獲取方法

    public ChannelInitializer getChannelHandler(AbstractNettyConnector connector) {return new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast(new ReadTimeoutHandler(15, TimeUnit.SECONDS));pipeline.addLast(new LoggingHandler());addPipeline(pipeline);}};}public void addPipeline(){// 子類覆蓋時間該方法
}

通過這樣的方式我們在定義公共的handler同時也能支持子類實現自定義的handler處理特定的事件。
下邊給出一些常見的通用handler

  1. ReconnectHandler:重連處理,我們在連接服務端,可能由于網絡或者其他問題,會導致連接斷開,這個時候我們就需要一個handler去處理重連的情況
  2. ReadTimeoutHandler:因為客戶端只做讀取,所以這邊還需要一個超時讀取的handler,用于檢測服務讀取通道的狀態,如果超時未讀取數據,那么我們可以做一些操作
  3. DecodeHandler:解碼器,在處理真正的消息之前我們需要先解碼數據
  4. MessageHandler:消息處理器,解析完解碼的數據后,我們真正對消息進行處理的地方

我們整個通用鏈路的handler,大概就如下
在這里插入圖片描述

解碼器的選擇

由于TCP連接中存在粘包黏包的現象,發過來的消息不一定是個完整的包,所以我們在我們自己的解碼器之前還需要定一個解碼器處理粘包黏包的問題,對于我自己這邊使用的是,定長的解碼器
new LengthFieldBasedFrameDecoder(ByteOrder.LITTLE_ENDIAN, 1500, 0, 2, -2, 0, true)
對于該解碼器構造參數的解析

  1. 大端和小端模式的選擇,這個需要具體詢問上游的消息格式
  2. 定長長度
  3. lengthFieldOffset:表示這個包長度的字段,是從第幾個字節開始讀
  4. lengthFieldLength:長度字段所占用的字節數
  5. lengthAdjustment:用來修正長度字段,比如說你的長度讀出來的字節數,并不包含自己,那么在該值里 你就得填這個長度字段的長度

舉例:假設現在有個2個字節的長度字段,讀出來的值是152,這個值是數據包的長度不包含長度字段,那么lengthAdjustment就應該填-2,減去長度字段 得到真正的數據長度

連接監聽器

在啟動netty客戶端時,可能會產生連接失敗等情況,這個時候我們可以在啟動處增加一個連接監聽器,用來監控啟動情況,這個不同于ReconnectHandler,那個是用于處理連接建立和斷開時的重連器

ChannelFuture connect = bootstrap.connect(serverAddress, serverPort);
connect.addListener(new ConnectListener(this));public class ConnectListener implements ChannelFutureListener {@Overridepublic void operationComplete(ChannelFuture future) throws Exception {if (!future.isSuccess()) {Throwable cause = future.cause();if (cause instanceof ConnectTimeoutException) {// do something} else {log.error("連接異常", cause);}future.channel().close();}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20178.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20178.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20178.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器學習:人工智能中實現自動化決策與精細優化的核心驅動力

機器學習在人工智能中確實扮演著實現自動化決策與精細優化的核心驅動力角色。以下是關于這一點的詳細分析: 一、機器學習在自動化決策中的應用 數據驅動:機器學習依賴于大量的數據來進行模型訓練和評估,從而確保決策的準確性。通過自動化數據分析和處理,機器學習能夠從海量…

LabVIEW與Arm控制器之間的通訊

LabVIEW是一個強大的圖形化編程環境&#xff0c;廣泛應用于自動化控制、數據采集和測試測量等領域。而Arm控制器則是嵌入式系統中常用的處理器架構&#xff0c;廣泛用于各種控制和計算任務。將LabVIEW與Arm控制器進行通訊控制&#xff0c;可以結合二者的優勢&#xff0c;實現高…

vue3 中可緩存的方法

場景&#xff1a;在列表中&#xff0c;有這么一個屬性&#xff0c;需要通過同行的其他屬性&#xff0c;進行復雜的計算&#xff0c;才能得出&#xff0c;如果我們用方法&#xff0c;然后傳參&#xff0c;得到這個屬性&#xff0c;那么每次更改列表后&#xff0c;每行都會重新計…

WordPress plugin MStore API SQL注入漏洞復現(CVE-2023-3077)

0x01 產品簡介 WordPress和WordPress plugin都是WordPress基金會的產品。WordPress是一套使用PHP語言開發的博客平臺。該平臺支持在PHP和MySQL的服務器上架設個人博客網站。WordPress plugin是一個應用插件。 0x02 漏洞概述 WordPress plugin MStore API 3.9.8 版本之前存在S…

Linux 深入講解自動化構建工具

各位大佬好 &#xff0c;這里是阿川的博客 &#xff0c; 祝您變得更強 個人主頁&#xff1a;在線OJ的阿川 大佬的支持和鼓勵&#xff0c;將是我成長路上最大的動力 阿川水平有限&#xff0c;如有錯誤&#xff0c;歡迎大佬指正 Linux一系列的文章&#xff08;質量分均在93分…

配置arduino和ESP8266

首先準備好arduino 的IDE和ESP8266的驅動以及板子 1.安裝驅動&#xff0c;雙擊x64的版本驅動&#xff0c;安裝好以后&#xff0c;在資源管理器檢查端口&#xff0c;比如下下圖出現的COM4就是esp8266所使用的端口 2.安裝好arduino最好不要在路徑中存在中文符號&#xff0c;打開…

水滴式粉碎機:多功能飼料粉碎設備

飼料粉碎機是一種專門用于將各種飼料原料進行粉碎處理的機械設備。無論是玉米、小麥等谷物&#xff0c;還是豆粕、魚粉等動物性原料&#xff0c;甚至是一些粗纖維含量較高的秸稈、牧草等&#xff0c;都可以經過飼料粉碎機的處理&#xff0c;變成適合畜禽消化吸收的精細飼料。這…

521源碼-游戲源碼-2024卡牌回合自走棋手游《夢間集》推出全新Linux手工服務端

首款稀有卡牌回合自走棋手游《夢間集》推出全新Linux手工服務端整理 更多網站源碼&#xff0c;游戲源碼&#xff0c;學習教程&#xff0c;請點擊&#x1f449;-521源碼-&#x1f448;獲取最新資源 本游戲下載地址&#xff1a;2024卡牌回合自走棋手游《夢間集》推出全新Linux手…

【再探】設計模式—中介者模式、觀察者模式及模板方法模式

中介者模式讓多對多的復雜引用關系變成一對多&#xff0c;同時能通過中間類來封裝多個類中的行為&#xff0c;觀察者模式在目標狀態更新時能自動通知給訂閱者&#xff0c;模版方法模式則是控制方法的執行順序&#xff0c;子類在不改變算法的結構基礎上可以擴展功能實現。 1 中…

003 MySQL

文章目錄 左外連接、右外連接 的區別where/having的區別執行順序聚合 聚合函數MySQL約束事務一致性一致性的含義一致性在事務中的作用如何維護一致性 存儲引擎 Innodb MyIsam區別事務的ACID屬性數據庫的隔離級別MySQL中的并發問題1. 鎖等待和死鎖2. 并發沖突3. 臟讀、不可重復讀…

理解接口回調及其在 RabbitMQ 中的實際運用

介紹 接口回調是一種常見的編程模式&#xff0c;它在異步編程中發揮著重要作用。本文將通過一個簡單的示例介紹接口回調的概念和原理&#xff0c;并探討它在 RabbitMQ 中的實際應用。 接口回調的概念 接口回調是一種編程模式&#xff0c;用于在異步編程中實現回調機制。它允許…

ChatGPT AI專題資料合集【65GB】

介紹 ChatGPT & AI專題資料合集【65GB】 &#x1f381;【七七云享】資源倉庫&#xff0c;海量資源&#xff0c;無償分享√

stm32和esp32硬件資源上有什么區別 哪個更適合初學者

對于初學者來說&#xff0c;ESP32和STM32都有各自的優點和適用場景&#xff0c;但通常ESP32被認為是更適合初學者的選擇&#xff0c;原因如下&#xff1a; 內置無線通信&#xff1a;ESP32集成了WiFi和藍牙功能&#xff0c;這意味著初學者可以更容易地構建無線通信應用&#xff…

文件系統小冊(FusePosixK8s csi)【1 Fuse】

文件系統小冊&#xff08;Fuse&Posix&K8s csi&#xff09;【1 Fuse&#xff1a;用戶空間的文件系統】 Fuse(filesystem in userspace),是一個用戶空間的文件系統。通過fuse內核模塊的支持&#xff0c;開發者只需要根據fuse提供的接口實現具體的文件操作就可以實現一個文…

【測評|白嫖】雨云寧波新區,2C4G200M,公測期間全免費!

雨云香港三區云服務器&#xff0c;高性能的 Xeon Platinum 處理器 企業級 NVME SSD 高性能云服務器。 一鍵白嫖鏈接&#xff1a;https://www.rainyun.com 本篇純測評&#xff0c;無任何廣告&#xff0c;請放心食用&#xff01;&#xff01; 本次測評服務器配置如下&#xff1…

用萬界星空科技低代碼平臺能快速搭建一個云MES系統

一、低代碼平臺與MES:智能制造的新篇章 隨著工業4.0和智能制造的興起&#xff0c;企業對于生產過程的數字化、智能化需求日益迫切。傳統的MES系統實施周期長、成本高&#xff0c;成為許多企業數字化轉型的瓶頸。而低代碼開發平臺的出現為這一問題提供了新的解決思路。 二、萬界…

linux可觀測性ebpf(一) ----------- 環境搭建

參考書籍 開發環境 Ubuntu 18.04.6 LTS (GNU/Linux 5.4.0-150-generic x86_64) 1.1 下載內核源碼 cd /usr/src/ sudo git clone -b v5.4 https://github.com/torvalds/linux.git1.2 下載書中代碼 git clone https://github.com/bpftools/linux-observability-with-bpf1.3 編…

海外媒體通稿:9個極具創意的旅游業媒體推廣案例分享-華媒舍

如今&#xff0c;旅游業正迅速發展&#xff0c;媒體推廣成為吸引游客的關鍵。為了更好地展示旅游目的地&#xff0c;許多創意而富有創新的媒體推廣策略應運而生。本文將介紹九個極富創意的旅游業媒體推廣案例&#xff0c;為廣大從業者帶來靈感和借鑒。 1. 視頻系列&#xff1a;…

【Python面試題收錄】Python的GIL機制

Python中的全局解釋器鎖&#xff08;Global Interpreter Lock&#xff0c;簡稱GIL&#xff09;&#xff0c;同一進程中假如有多個線程運行&#xff0c;一個線程在運行python程序的時候會霸占python解釋器&#xff08;加了一把鎖即GIL&#xff09;&#xff0c;使該進程內的其他線…

4. MySQL 約束

文章目錄 【 1. 主鍵約束 PRIMARY KEY 】1.1 在創建表時設置主鍵約束設置單字段主鍵在創建表時設置聯合主鍵 1.2 在修改表時添加主鍵約束1.3 刪除主鍵約束1.4 主鍵自增長 AUTO_INCREMENT指定自增字段初始值自增字段不連續 【 2. 外鍵約束 FOREIGN KEY 】2.1 在創建表時設置外鍵…