spring boot 集成netty,及其一些基本概念

一、基本概念
1、channel:通道,入站或者出站數據的載體
2、ChannelHandler:通道處理器,業務邏輯寫在這里面,netty 5版本將入戰和出站合并成了ChannelHandler
3、ChannelPipeline:通道里的管道,是一個或者多個ChannelHandler鏈的容器,當channel被創建時,會為該Channel自動分配一個ChannelPipeline,ChannelPipeline中可以放多個ChannelHandler。
4、ChannelHandlerContext:通道處理器上下文,代表了ChannelHandler和ChannelPipeline的關聯關系,每當有ChannelHandler被添加到ChannelPipeline時就會創建一個ChannelHandlerContext。ChannelHandlerContext的主要功能是管理它所關聯的ChannelHandler和在同一個ChannelPipeline中其他的ChannelHandler之間的交互。
5、ChannelHandlerAdapter:通道處理器的適配器,提供了入站和出站ChannelHandler的基本實現。
6、EventLoop與EventLoopGroup:稱為事件循環,用來運行連著周期內發生的事件的。EventLoopGroup為每個新創建的Channel分配一個EventLoop。多個Channel可以共享一個EventLoop。
7、SimpleChannelInboundHandler:可以用來接收解碼消息,無需手動釋放資源。
8、引導:作用是創建Channel組裝成可運行的程序。分為客戶端引導和服務端引導。客戶端引導:為客戶端應用程序創建Channel當調用bind()或者connect()方法時就會創建一個Channel。服務器引導:當bind()方法被調用時會創建一個ServerChannel,當有客戶端連接并且服務器端接受時,ServerChannel會創建相應的Channel進行通信。
9、ChannelInitializer:通道Channel初始化時調用。
10、入站和出站:入站是指數據從網絡層流向你的應用程序,出戰是指數據從應用程序流向網絡層。在ChannelPipeline的流向,入站是從頭到尾,出站是從尾流向頭部。
11、注意:ChannelHandler的實現類,如果被標記為@Sharable,則代碼該處理器可以被添加到多個ChannelPipeline中去。
二、搭建一個簡單的客戶端和服務端
1、安裝依賴

<dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>5.0.0.Alpha2</version>
</dependency>

2、客戶端
2.1 新建處理器類:EchoClientHandler

@ChannelHandler.Sharable
public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {@Overridepublic void channelActive(ChannelHandlerContext ctx){ctx.writeAndFlush(Unpooled.copiedBuffer("Netty rocks!", CharsetUtil.UTF_8));}@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg){ByteBuf in = (ByteBuf) msg;System.out.println("Client received: " + in.toString(CharsetUtil.UTF_8));}@Overrideprotected void messageReceived(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause){cause.printStackTrace();ctx.close();}
}

2.2 新建客戶端引導

public class EchoClient {private final String host;private final int port;public EchoClient(String host, int port) {this.host = host;this.port = port;}public void start() throws Exception {EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap bootstrap = new Bootstrap();bootstrap.group(group).channel(NioSocketChannel.class).remoteAddress(new InetSocketAddress(host, port)).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new EchoClientHandler());}});ChannelFuture future = bootstrap.connect().sync();future.channel().closeFuture().sync();}finally {group.shutdownGracefully().sync();}}public static void main(String[] args) throws Exception {new EchoClient("127.0.0.1", 2221).start();}}

3、服務器端
3.1 新建服務器端ChannelHandler

@ChannelHandler.Sharable
//@ChannelHandler.Sharable
public class EchoServerHandler extends SimpleChannelInboundHandler {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg){ByteBuf in = (ByteBuf) msg;System.out.println("Server received: " + in.toString(CharsetUtil.UTF_8));ctx.write(in);}@Overridepublic void channelReadComplete(ChannelHandlerContext ctx){ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause){cause.printStackTrace();ctx.close();}@Overrideprotected void messageReceived(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {}
}

3.2 新建服務器端引導

public class EchoServer {private final int port;public EchoServer(int port) {this.port = port;}public void start() throws Exception {final EchoServerHandler serverHandler = new EchoServerHandler();EventLoopGroup group = new NioEventLoopGroup();try {ServerBootstrap b = new ServerBootstrap();b.group(group).channel(NioServerSocketChannel.class).localAddress(new InetSocketAddress(port)).childHandler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(serverHandler);}});System.out.println("監聽端口");ChannelFuture f=b.bind().sync();System.out.println("服務端關閉");f.channel().closeFuture().sync();}finally {group.shutdownGracefully().sync();}}public static void main(String[] args) throws Exception {new EchoServer(2221).start();}
}

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

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

相關文章

7月23日華為機考真題第一題100分

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? bishipass.com 01. 創業投資收益優化 問題描述 K小姐剛剛大學畢業,手頭有 m m m 元資金想要進行創業投資。她發現了 k k

HTML5 跨文檔通信機制:postMessage API 詳解與應用

postMessage 是 HTML5 規范中定義的跨文檔通信&#xff08;Cross-Document Messaging&#xff09;API&#xff0c;其設計目的是解決不同源&#xff08;協議、域名、端口任一存在差異&#xff09;的窗口&#xff08;如 iframe 嵌入的文檔、window.open 創建的新窗口&#xff09;…

Kafka——Kafka中的位移提交

引言&#xff1a;為什么位移提交至關重要&#xff1f;在Kafka的分布式消息系統中&#xff0c;消費者組&#xff08;Consumer Group&#xff09;通過分區分配機制實現負載均衡和容錯&#xff0c;但如何準確記錄每個消費者的消費進度&#xff0c;是保證消息不丟失、不重復的關鍵。…

java設計模式 -【裝飾器模式】

裝飾器模式的定義 裝飾器模式&#xff08;Decorator Pattern&#xff09;是一種結構型設計模式&#xff0c;允許向一個現有對象動態添加新功能&#xff0c;同時不改變其結構。它通過創建包裝對象&#xff08;裝飾器&#xff09;來包裹原始對象&#xff0c;并在保持原始對象方法…

手寫字體生成器:一鍵模擬真實筆跡

軟件介紹 在自媒體創作領域&#xff0c;手寫體文案因其獨特的藝術感而備受青睞。然而&#xff0c;真實的手寫往往效率低下且效果難以保證。今天為大家推薦一款專業的手寫模擬軟件&#xff0c;能夠一鍵生成逼真的手寫字體效果&#xff0c;完美解決創作效率與質量的雙重需求。…

【Android】用 ViewPager2 + Fragment + TabLayout 實現標簽頁切換

文章目錄【Android】用 ViewPager2 Fragment TabLayout 實現標簽頁切換一、引入&#xff1a;什么是 ViewPager2 &#xff1f;二、ViewPager2 的基礎使用1. 在布局文件 (activity_main.xml)中添加 ViewPager22. 制作一個 Fragment2.1 創建一個布局文件2.2 創建一個 Fragment 類…

嵌入式學習-土堆目標檢測(4)-day28

Pytorch中加載自定義數據集 - VOC其中需要pip install xmltodict#voc_dataset.pyimport os import torch import xmltodict from PIL import Image from torch.utils.data import Dataset import torchvision.transforms as transformsclass VOCDataset(Dataset): def __init_…

Spring MVC上下文容器在Web容器中是如何啟動的(源碼深入剖析)?

文章目錄一、雙容器架構&#xff1a;MVC容器與根容器的關系二、啟動全流程解析1. 啟動流程全景圖2. 初始化根容器&#xff08;Root WebApplicationContext&#xff09;2.1 Tomcat 中啟動入口源碼解析2.2 Spring 根上下文啟動源碼解析3. 初始化 MVC 容器&#xff08;DispatcherS…

【iOS】編譯和鏈接、動靜態庫及dyld的簡單學習

文章目錄編譯和鏈接1??核心結論&#xff1a;一句話區分2??編譯過程&#xff1a;從源代碼到目標文件&#xff08;.o&#xff09;2.1 預處理&#xff08;Preprocessing&#xff09;&#xff1a;“替換變量復制粘貼”2.2 編譯&#xff08;Compilation&#xff09;&#xff1a;…

金山辦公WPS項目產品總監陳智新受邀為第十四屆中國PMO大會演講嘉賓

全國PMO專業人士年度盛會珠海金山辦公軟件有限公司WPS項目產品總監 陳智新先生 受邀為“PMO評論”主辦的2025第十四屆中國PMO大會演講嘉賓&#xff0c;演講議題為&#xff1a;中小團隊PMO的成長之路&#xff0c;敬請關注&#xff01;議題簡要&#xff1a;在競爭激烈、需求多變的…

web安全 | docker復雜環境下的內網打點

本文作者&#xff1a;Track-syst1m一.前言本文涉及的相關漏洞均已修復、本文中技術和方法僅用于教育目的&#xff1b;文中討論的所有案例和技術均旨在幫助讀者更好地理解相關安全問題&#xff0c;并采取適當的防護措施來保護自身系統免受攻擊。二.大概流程1. 外網打點? 漏洞利…

iTwin 幾何屬性獲取

面積體積半徑獲取幾何屬性&#xff0c;如面積&#xff0c;體積&#xff0c;半徑&#xff0c;可以使用getMassProperties這個接口async onGetMassProperty(){const vp IModelApp.viewManager.selectedView;const iModel vp?.iModel;if (!iModel) return;console.log("iM…

OpenLayers 快速入門(九)Extent 介紹

看過的知識不等于學會。唯有用心總結、系統記錄&#xff0c;并通過溫故知新反復實踐&#xff0c;才能真正掌握一二 作為一名摸爬滾打三年的前端開發&#xff0c;開源社區給了我飯碗&#xff0c;我也將所學的知識體系回饋給大家&#xff0c;助你少走彎路&#xff01; OpenLayers…

LeetCode 121. 買賣股票的最佳時機 LeetCode 122. 買賣股票的最佳時機II LeetCode 123.買賣股票的最佳時機III

LeetCode 121. 買賣股票的最佳時機嘗試一&#xff1a;暴力解決方法常用兩個指針去遍歷prices數組&#xff0c;dp[i]用于記錄在第i天所獲得的最大利潤。時間復雜度是O(N^2)&#xff0c;超出時間限制。Codeclass Solution(object):def maxProfit(self, prices):"""…

【LeNet網絡架構】——深度學習.卷積神經網絡

目錄 1 MLP 2 LeNet簡介 3 Minst數據集 3.1 MINST數據集簡介 3.2 MNIST數據集的預處理 4 LeNet手寫數字識別 LeNet由Yann Lecun 提出&#xff0c;是一種經典的卷積神經網絡&#xff0c;是現代卷積神經網絡的起源之一。Yann將該網絡用于郵局的郵政的郵政編碼識別&#xff…

Python筆記完整版

常用pip源 &#xff08;1&#xff09;阿里云 http://mirrors.aliyun.com/pypi/simple/&#xff08;2&#xff09;豆瓣 http://pypi.douban.com/simple/&#xff08;3&#xff09;清華大學 https://pypi.tuna.tsinghua.edu.cn/simple/&#xff08;4&#xff09;中國科學技術大學…

2025 鴻蒙創新賽又來了,萬少教你如何強勢切入 HarmonyOS AI特性

2025 鴻蒙創新賽又來了&#xff0c;萬少教你如何強勢切入 前言 ? 2025 華為HarmonyOS 創新賽又來了&#xff0c;創新賽是鴻蒙生態最大規模開發者官方賽事&#xff0c;最高獲百萬激勵。 參賽資格 面向所有開發者開放以隊伍的形式來參加&#xff0c;可以一個人報名一個隊伍&a…

【智能模型系列】Unity通過訪問Ollama調用DeepSeek模型進行本地部署

【智能模型系列】Unity通過訪問Ollama調用DeepSeek模型進行本地部署 目錄 一、前言 二、環境準備 三、核心代碼解析 1、參數配置 2. CallDeepSeek.cs - API交互控制器 3、 MainPanel.cs - 用戶界面控制器 四、源碼 一、前言 在本教程中,我將分享如何在Unity中集成本地…

什么是5G-A三防平板?有什么特點?哪些領域能用到?

在工業自動化與數字化轉型浪潮中&#xff0c;三防平板電腦已成為“危、急、特”場景的核心工具。這類設備不僅具備堅固耐用的物理防護特性&#xff0c;更融合了先進的通信技術與智能處理能力。而隨著5G技術向5G-A階段演進&#xff0c;新一代三防平板正為行業應用注入全新動能。…

Flink實時流量統計:基于窗口函數與Redis Sink的每小時PV監控系統(學習記錄)

題目&#xff1a;利用flink統計網站瀏覽量&#xff0c;并寫入redis。利用窗口函數以及算子實現每小時PV&#xff08;網站的頁面瀏覽量&#xff09;統計&#xff0c;對統計后結果數據格式進行設計&#xff0c;存儲至Redis中&#xff08;利用sink將處理后結果數據輸出到redis數據…