Netty的InboundHandler 和OutboundHandler

一、InboundHandler 和OutboundHandler的區別

在Netty中,"inbound"表示來自外部來源(如網絡連接)的數據,而"outbound"則表示從應用程序發送到外部目標(如網絡連接或其他服務)的數據。

"Inbound"主要涉及應用程序接收和處理外部數據的過程。這包括從網絡連接讀取數據、解碼處理數據、執行業務邏輯等操作。例如,在一個服務器應用程序中,inbound操作可能涉及監聽和接受客戶端連接,讀取客戶端發送的請求數據,并將其轉發給適當的處理程序進行處理。inbound監聽的事件如下:

  • channelRegistered/channelUnregistered
  • channelActive/channelInactive
  • channelRead
  • channelReadComplete
  • channelWritabilityChanged
  • userEventTriggered
  • exceptionCaught

"Outbound"主要涉及應用程序發送數據到外部目標的過程。這包括將數據編碼為網絡傳輸的格式、通過網絡連接發送數據、處理發送的數據等操作。例如,在一個客戶端應用程序中,outbound操作可能涉及將請求數據編碼為適當的傳輸協議,通過網絡連接發送給服務器,并等待響應數據。outbound監聽的事件如下:

  • bind
  • connect
  • disconnect
  • close
  • deregister
  • read
  • write
  • flush

Netty的Pipeline采用責任鏈設計模式,責任鏈的每個節點是ChannelHandlerContext,通過prev和next節點實現雙向鏈表。ChannelHandlerContext對象封裝了ChannelHandler對象。Pipeline的首尾節點分別是io.netty.channel.DefaultChannelPipeline.HeadContext和io.netty.channel.DefaultChannelPipeline.TailContext。

Pipeline在分發事件的時候,會根據事件類型選擇合適的handler(Inbound/Outbound本身會通用掩碼位注冊監聽的事件類型),可參考?《Netty之ChannelHandlerMask詳解》

總結:

  • InboundHandler處理從網絡接收的數據,負責解析和處理輸入數據。
  • OutboundHandler處理向網絡發送的數據,負責封裝和處理輸出數據。
  • InboundHandler和OutboundHandler在處理數據的方向上有所區別,但它們通常一起使用,通過ChannelPipeline連接在一起,形成一個完整的數據處理鏈。

二、客戶端消息在handler的流向

我們通過簡單的例子來說明

2.1注冊一個簡單的Netty服務器

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;public class EchoServer {private int port;public EchoServer(int port) {this.port = port;}public void start() throws Exception{EventLoopGroup boss = new NioEventLoopGroup();EventLoopGroup worker = new NioEventLoopGroup();ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(boss, worker).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception {ChannelPipeline pipeline = socketChannel.pipeline();for (int i = 0; i < 3; i++) {pipeline.addLast(new InboundHandler(i + 1));}for (int i = 0; i < 3; i++) {pipeline.addLast(new OutboundHandler(i + 1));}System.out.println("handler注冊順序:");pipeline.names().forEach(x -> {System.out.println("handler:" + x);});}}).option(ChannelOption.SO_BACKLOG,100000).childOption(ChannelOption.SO_KEEPALIVE,true);bootstrap.bind(port).sync();System.out.println("服務啟動,監聽端口@"+port);}public static void main(String[] args)  throws Exception {new EchoServer(8001).start();}static class InboundHandler extends ChannelInboundHandlerAdapter {private int index;public InboundHandler(int index) {this.index = index;}@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {System.out.println("InboundChannel["+index+"]接收消息");ctx.fireChannelRead(msg);if (index == 3) {ctx.channel().write("df");}}}static class OutboundHandler extends ChannelOutboundHandlerAdapter {private int index;public OutboundHandler(int index) {this.index = index;}@Overridepublic void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {System.out.println("OutboundChannel["+index+"]發送消息");ctx.write(msg, promise);}}}

在這個例子,啟動一個簡單的socket服務器,并依次注冊了三個inboundhandler,三個outboundhandler。啟動之后,通過簡單的telnet命令,往socket發送數據

2.2使用telnet發送數據

使用windows自帶的telnet,輸入命令:telnet localhost 8001,然后隨便輸入一個字符

(部分系統需要通過按“Win+R”快捷鍵,打開“運行”對話框,輸入“optionalfeatures”后按回車鍵;在打開的“Windows功能”窗口中,找到并勾選“Telnet客戶端”)

2.3服務端響應

從這個例子,可以看出

InboundHandler是按照Pipleline的加載順序,順序執行;

而OutboundHandler是按照Pipleline的加載順序,逆序執行。

需要注意的是,由于pipeline采取的是責任鏈方式,在任何一個節點,如果沒有把事件往下傳,事件就會在本節點終止。

   public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {System.out.println("InboundChannel["+index+"]接收消息");ctx.fireChannelRead(msg);  //注釋次代碼,則事件不會往下個handler傳遞數據}

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

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

相關文章

Git——Upload your open store

0.default config ssh-keygen -t rsa #之后一路回車,當前目錄.ssh/下產生公私鑰 cat ~/.ssh/id_rsa.pub #復制公鑰到賬號 git config --global user.email account_email git config --global user.name account_name1. 上傳一個公開倉庫 查看當前分支&#xff1a; git branc…

MATLAB基于隱馬爾可夫模型-高斯混合模型-期望最大化的MR圖像分割

隱馬爾可夫模型是一種統計模型&#xff0c;它描述了馬爾可夫過程&#xff0c;隱馬爾可夫過程中包含隱變量&#xff0c;語音識別和詞性自動標注等一些領域常常使用隱馬爾可夫模型方法來處理。馬爾可夫過程是一類隨機過程&#xff0c;馬爾可夫鏈是它的原始模型&#xff0c;馬爾可…

GPT對話知識庫——FreeRTOS中寄存器BASEPRI的作用

提問模型&#xff1a;GPT-4-TURBO-PREVIEW 提問時間&#xff1a;2024.03.02 1&#xff0c;問&#xff1a; 舉例詳細說明寄存器BASEPRI在freertos中作用 1&#xff0c;答&#xff1a; 在使用FreeRTOS這樣的實時操作系統時&#xff0c;確保系統的實時性和響應能力至關重要。其中…

【C++那些事兒】深入理解C++類與對象:從概念到實踐(中)| 默認構造函數 | 拷貝構造函數 | 析構函數 | 運算符重載 | const成員函數

&#x1f4f7; 江池俊&#xff1a; 個人主頁 &#x1f525;個人專欄&#xff1a; ?數據結構冒險記 ?C那些事兒 &#x1f305; 有航道的人&#xff0c;再渺小也不會迷途。 文章目錄 1. 類的6個默認成員函數2. 構造函數2.1 概念2.2 特性 3. 析構函數3.1 概念3.2 特性 4. 拷貝…

國際視頻編解碼標準提案下載地址

H.266 相關提案下載地址&#xff1a;http://phenix.it-sudparis.eu/jvet/ 更新的地址&#xff1a;https://jvet-experts.org/ H.265 提案下載地址&#xff1a;http://phenix.int-evry.fr/jct/ 標準文檔下載地址&#xff1a;http://www.itu.int/rec/T-REC-H.265 H.264 提案下載…

QT多語言切換功能

一.目的 在做項目時&#xff0c;有時希望我們的程序可以在不同的國家使用&#xff0c;這樣最好的方式是一套程序能適應于多國語言。 Qt提供了這樣的功能&#xff0c;使得一套程序可以呈現出不同的語言界面。本文將介紹QT如何實現多語言&#xff0c;以中文和英文為例。 QT開發…

過于老舊的pytorch_ssim包 請從github下載源碼

有些冷門算法真的不要隨便pip&#xff0c;有可能下載到史前版本…最好還是找源代碼 汗 今天要用到SSIM損失函數&#xff0c;從網上簡單看了一下原理就想測試一下&#xff0c;偷了一下懶就直接在命令行輸入pip install pytorch_ssim了&#xff0c;結果報了一堆錯誤&#xff08;汗…

Qt將Unicode轉換成UTF8中文

解析字符串&#xff0c;并將里面的Unicode轉換成中文 QString unicodeToUtf8(QString unicode) {QString result;for (int i 0; i < unicode.length(); i){QString flag unicode.mid(i,2); if (flag "\\u"){QString s1 unicode.mid(i 2, 4);result.append(s…

如何自定義一個spring-boot-starter

在我的理解中&#xff0c;spring-boot-starter就是一個依賴工具包&#xff0c;但是它和普通的依賴又有所區別&#xff0c;那么首先spring-boot-starter-一定是一個spring-boot項目&#xff0c;然后它和一般的依賴有什么區別呢&#xff0c;我們可以在它的resources目錄下定義一個…

Mysql實戰(1)之環境安裝

1&#xff0c;進入&#xff1a;MySQL :: MySQL Downloads 2&#xff0c; 3&#xff0c; 4&#xff0c;

【數據集】中國廣泛時空水質數據集(1980-2022)

中國廣泛時空水質數據集(1980-2022) 1 數據概述1.1 數據細節2 數據下載下載鏈接1:figshare參考1 數據概述 水質數據是評估水生生態系統福祉和確保人類清潔水源的關鍵資源。雖然水質數據集的可用性正在增長,但值得注意的是,中國缺乏可公開訪問的內陸和海洋國家水質數據集。…

Python算法題集_單詞搜索

Python算法題集_單詞搜索 題22&#xff1a;單詞搜索1. 示例說明2. 題目解析- 題意分解- 優化思路- 測量工具 3. 代碼展開1) 標準求解【原始矩陣狀態回溯】2) 改進版一【字典檢測原始矩陣狀態回溯】3) 改進版二【矩陣狀態回溯】 4. 最優算法5. 相關資源 本文為Python算法題集之一…

DM數據庫學習之路(十九)DM8數據庫sysbench部署及壓力測試

sysbench部署 安裝依賴 yum -y install make automake libtool pkgconfig libaio-devel vim-common 上傳sysbench源代碼 sysbench_tool.tar 測試是否安裝成功 $ /opt/sysbench/sysbench-master-dpi/src/lua $ ./sysbench --version sysbench 1.1.0 sysbench測試DM 測試…

jupyter調用envs環境——jupyter內核配置虛擬環境

1.jupyter無法使用envs環境 pycharm的終端打開jupyter notebook&#xff1a; 在kernel下找不到上面的Pytorch_GPU環境&#xff1a; 2.解決方法 在對應的envs環境中安裝ipykernel&#xff1a; 將該環境寫入jupyter&#xff1a; python -m ipykernel install --user --name Py…

基于分位數回歸的長短期記憶神經網絡(QRLSTM)的MATLAB實現(源代碼)

分位數回歸的長短期神經記憶網絡介紹&#xff1a; QRLSTM&#xff08;Quantile Regression Long Short-Term Memory&#xff09;分位數回歸神經網絡是一種結合了長短期記憶&#xff08;LSTM&#xff09;神經網絡和分位數回歸的模型。這種神經網絡結構旨在對數據的不同分位數進行…

Java的四大引用詳解-沖擊金三銀四

強引用 像“Object obj new Object()”這類的引用均為強引用&#xff0c;當一個對象被強引用變量引用時&#xff0c;它處于可達狀態&#xff0c;是不可能被垃圾回收器回收的&#xff0c;即使該對象永遠不會被用到也不會被回收。 當JVM出現內存不足時&#xff0c;JVM進行垃圾回…

繼承-重寫

Phone基類&#xff1a; package ven;public class Phone {public Phone(){}public void call(String name){System.out.println("給"name"打電話");} } AIPhone子類&#xff1a; package ven;public class AIPhone extends Phone{Override //重載注解&am…

mTLS: openssl創建CA證書

證書可以通過openssl或者keytool創建&#xff0c;在本篇文章中&#xff0c;只介紹openssl。 openssl 生成證書 申請操作流程 生成ca證書私鑰, 文件名&#xff1a;ca.key生成ca證書&#xff0c;文件名&#xff1a;ca.crt生成Server/Client 證書私鑰&#xff0c;文件名&#x…

設計模式(十三)抽象工廠模式

請直接看原文:設計模式&#xff08;十三&#xff09;抽象工廠模式_抽象工廠模式告訴我們,要針對接口而不是實現進行設計。( )-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- …

系統架構設計文檔模版

XX 系統架構設計方案 修訂記錄 日期 版本號 修訂說明 修訂人 審核人 1、概述... 5 1.1&#xff0e;業務背景... 5 1.2&#xff0e;系統總體描述... 5 1.3&#xff0e;系統邊界圖... 5 1.4&#xff0e;名詞和縮略語... 5 1.…