久久国产精品一区二区三区四区,久色婷婷小香蕉久久,国产日韩欧美在线播放不卡,另类av一区二区

玩轉Netty,從“Hello World”開始!_全球快看
來源:三分惡    時間:2023-05-23 07:49:05

大家好,我是老三,之前里,我們討論了Java的三種IO模型,提到了網絡通信框架Netty,它簡化和優化了NIO的使用,這期,我們正式開始走近Netty。

為什么要用Netty?

首先當然是NIO的使用,本身比較復雜,而且還存在一些問題。

除此之外,如果在項目的開發中,要實現穩定的網絡通信,就得考慮網絡的閃斷、客戶端的重復接入、客戶端的安全認證、消息的編解碼、半包讀寫……


(資料圖片僅供參考)

所以,巧了,恰好有這么一個成熟穩定、性能強大、開箱即用的網絡框架擺在我們面前,相比較Java NIO,Netty更加出色:

易用性: Netty 在 NIO 基礎上進行了更高層次的封裝,屏蔽了 NIO 的復雜性,大大降低了開發難度;Netty 提供了很多開箱即用的工具,例如常用的行解碼器、長度域解碼器等,不需要自己再實現。穩定性: Netty 更加可靠穩定,修復和完善了 JDK NIO 較多已知問題,例如臭名昭著的 select 空轉導致 CPU 消耗 100%,TCP 斷線重連,keep-alive 檢測等問題。可擴展性: Netty 的的可擴展性做的非常好,比如支持可定制化的線程模型。

我們有什么理由拒絕這么一款優秀的網絡通信框架呢?代碼怎么寫不是寫嘍!

初識Netty什么是Netty?

Netty官方是這么定義Netty的:

Netty 是一個異步事件驅動的網絡應用程序框架,用于快速開發可維護的高性能協議服務器和客戶端。

組成圖-來源官方

Netty是一個開源的、單線程模型的 Java 網絡編程框架。Netty基于 NIO ,被廣泛應用于各種網絡應用程序開發。Netty支持多種協議,包括但不限于 HTTP、WebSocket、TCP、UDP 和 SSL/TLS 協議等。Netty 是非阻塞的,事件驅動的框架。Netty具有高性能、可擴展和易于使用的優點。Netty的現狀?

Netty 由 JBoss 社區開發維護的,它的社區相對比較活躍:

https://github.com/netty/netty:Github已經收獲31.2K星標https://netty.io/:官方網站,提供了比較完整的文檔

官方目前最新的版本是5.x,,但是很不幸,已經被社區放棄開發維護,屬于廢棄版本,最新的穩定版本是4.x 。

一般使用,推薦4.x,Netty 4.x對3.x不做兼容,我們后續的學習也基于Netty 4.x版本。

誰在用Netty?

作為最流行的網絡通信框架,大量的公司選擇它作為底層網絡通信框架,包括不限于:

使用Netty的公司

我們可能自己沒有直接用過Netty,但其實熟悉的很多開源中間件,都用到了Netty,比如:

服務治理:Apache Dubbo、gRPC。大數據:Hbase、Spark、Flink、Storm。搜索引擎:Elasticsearch。消息隊列:RocketMQ、ActiveMQ。

用到Netty的優秀產品非常多,大家感興趣可以看看:https://netty.io/wiki/related-projects.html。

從"Hello World"開始

氣氛襯托到這,不寫個Demo也過不去,還是從"Hello World"開始,我們領略一下Netty的風采。

創建一個Maven項目:這個就不用多說了吧

創建Maven項目

導入依賴:我們直接用4.x最新的版本

io.netty netty-all 4.1.92.Final 編寫代碼:那么我們就開始編寫這個Demo的服務器和客戶端相關代碼NettyServer:基于Netty的客戶端

/** *

Date: 2023/5/14 10:29

*

Author: fighter3

*

Description: Netty服務端Demo

*/public class NettyServer{ // 服務器監聽的端口號 private int port; public NettyServer(int port) { this.port = port; } /** * 啟動Netty服務器 * @throws InterruptedException */ public void run() throws InterruptedException { // 創建boss線程組和worker線程組 // bossGroup 用于監聽客戶端的連接請求,將連接請求發送給 workerGroup 進行處理 NioEventLoopGroup bossGroup = new NioEventLoopGroup(); // workerGroup 用于處理客戶端連接的數據讀寫 NioEventLoopGroup workerGroup = new NioEventLoopGroup(); try { // 創建 ServerBootstrap 對象,用于啟動 Netty 服務器 ServerBootstrap serverBootstrap = new ServerBootstrap(); // 綁定線程池事件組 serverBootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) // 通道初始化回調函數,在啟動的時候可以自動調用 .childHandler(new ChannelInitializer() { @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); // 添加消息處理器 pipeline.addLast(new NettyServerHandler()); } }); // 綁定端口,開始接收客戶端請求 ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); System.out.println("Netty服務器監聽端口:"+port); // 等待服務端監聽端口關閉 channelFuture.channel().closeFuture().sync(); } finally { //釋放線程組資源 bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } public static void main(String[] args) throws InterruptedException { // 創建服務器對象,監聽端口號為 8888 NettyServer server = new NettyServer(8888); System.out.println("============Netty服務器啟動...============="); // 啟動服務器 server.run(); System.out.println("============Netty服務器停止...============="); }}
NettyServerHandler:服務器的消息處理器,用于處理各種事件

/** *

Date: 2023/5/14 10:30

*

Author: fighter3

*

Description: Netty服務器消息處理器

*/public class NettyServerHandler extends ChannelInboundHandlerAdapter { /** * 當客戶端上線的時候會觸發這個方法 * @param ctx * @throws Exception */ @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { String message="你好,靚仔!"; ByteBuf hello = Unpooled.copiedBuffer(message, CharsetUtil.UTF_8); // 發送消息 ctx.writeAndFlush(hello); } /** *當 Channel 中有來自客戶端的數據時就會觸發這個方法 */ @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { ByteBuf buf = (ByteBuf) msg; System.out.println("客戶端發來的消息:" + buf.toString(CharsetUtil.UTF_8)); // 接收消息并打印輸出 } /** * 當有異常時觸發這個方法 */ @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); }}
NettyClient:使用Netty的客戶端,通過ip和端口連接服務端

/** *

Date: 2023/5/14 10:32

*

Author: fighter3

*

Description: Netty客戶端Demo

*/public class NettyClient { // 服務器 IP private String host; // 服務器監聽的端口號 private int port; public NettyClient(String host, int port) { this.host = host; this.port = port; } /** * 啟動 Netty 客戶端 */ public void run() throws InterruptedException { // 創建事件循環組 NioEventLoopGroup group = new NioEventLoopGroup(); try { // 創建 Bootstrap 對象 Bootstrap bootstrap = new Bootstrap(); // 配置 Bootstrap 對象 // 設置線程組 bootstrap.group(group) // 設置客戶端通信的通道類型為NIO類型 .channel(NioSocketChannel.class) .handler(new ChannelInitializer() { // 通道初始化回調函數,在啟動的時候可以自動調用 @Override public void initChannel(SocketChannel ch) throws Exception { // 添加消息處理器 ch.pipeline().addLast(new NettyClientHandler()); } }); // 連接服務器,異步等待連接成功 ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); System.out.println("===========Netty客戶端連接服務端========="); // 等待客戶端連接關閉 channelFuture.channel().closeFuture().sync(); } finally { //釋放資源 group.shutdownGracefully(); } } public static void main(String[] args) throws InterruptedException { // 創建客戶端對象,并連接到服務器 NettyClient client = new NettyClient("127.0.0.1", 8888); // 啟動客戶端,開始發送消息 client.run(); }}
NettyClientHandler:Netty客戶端處理器,用于處各種事件

/** *

Date: 2023/5/14 10:33

*

Author: fighter3

*

Description: Netty客戶端處理器

*/public class NettyClientHandler extends ChannelInboundHandlerAdapter { /** * 當 Channel 準備就緒時就會觸發這個方法 */ @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { String message="大佬,帶帶我!"; ByteBuf hello = Unpooled.copiedBuffer(message, CharsetUtil.UTF_8); // 發送消息 ctx.writeAndFlush(hello); } /** * 當 Channel 中有來自服務器的數據時就會觸發這個方法 */ @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { ByteBuf buf = (ByteBuf) msg; System.out.println("服務端發來的消息:" + buf.toString(CharsetUtil.UTF_8)); // 接收消息并打印輸出 } /** * 發生異常就會觸發這個方法 */ @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); }}
運行一下:先啟動NettyServer,再啟動NettyClient,看下運行結果

============Netty服務器啟動...=============Netty服務器監聽端口:8888客戶端發來的消息:大佬,帶帶我!

===========Netty客戶端連接服務端=========服務端發來的消息:你好,靚仔!

好了,一個簡單的Netty入門Demo就寫完了,Netty是一個雙工通信的網絡框架,可以看到,服務端和客戶端,流程基本上一致,主要包括這么幾個步驟:

創建事件循環組和相關對象,用于監聽和處理網絡事件;配置 Netty 服務器或客戶端的啟動參數,包括線程組、通道類型、TCP 參數等;給服務器或客戶端的 ChannelPipeline 添加各種 ChannelHandler,用于處理不同的網絡事件;綁定端口啟動服務器或連接服務器;等待服務器或客戶端連接關閉,釋放相關資源。

服務器&客戶端初始化啟動流程

雖然這個Demo比較簡單,但其實已經用到了Netty里幾個比較關鍵的組件:

ByteBuf:Netty 的字節容器,類似于 Java 的 ByteBuffer,但是提供了更加強大、簡便且安全的 API,用于在網絡中傳遞二進制數據;EventLoopGroup:Netty 的事件循環組,用于管理和調度連接到服務器或者從服務器連接出去的所有 Channel 上的事件循環;ServerBootstrap:Netty 的服務器啟動類,用于啟動和配置一個 TCP/IP 服務器;Bootstrap:Netty 的客戶端啟動類,用于啟動和配置一個 TCP/IP 客戶端;Channel:Netty 的核心概念,用于表示一個通信通道,可以讀取和寫入數據;ChannelPipeline:Netty 的 Channel 處理器,用于在傳入的數據上執行一組 ChannelHandler;ChannelHandler:Netty 的核心組件,用于處理各種通信事件,例如讀取數據、寫數據、建立連接等;

Netty的重要組件

后續,我們還會和這些組件打更多的交道。

好了,那么這期內容就到這了,這期里我們初步了解了Netty,包括什么是Netty、Netty現狀、Netty的應用,還寫了一個簡單的Demo。下一期,我們繼續深入了解Netty,敬請期待。

參考:

[1].https://netty.io/

[2].《Netty權威指南》

[3]. 《Netty核心原理剖析與RPC實踐》

關鍵詞:

X 關閉

X 關閉

久久国产精品一区二区三区四区,久色婷婷小香蕉久久,国产日韩欧美在线播放不卡,另类av一区二区
久久只精品国产| 亚洲一区二区三区在线看| 欧美色123| 国产老女人精品毛片久久| 亚洲一区免费在线观看| 欧美精品激情在线| 激情伊人五月天久久综合| 欧美va天堂| 欧美理论视频| 国产精品一区二区你懂得| 亚洲精品在线观看免费| 亚洲精品国产精品久久清纯直播| 亚洲电影自拍| 国产精品免费观看视频| 99热免费精品| 久久久噜噜噜| 国产精品白丝黑袜喷水久久久| 久久精品人人| 欧美日韩视频在线一区二区| 国产一级一区二区| 亚洲欧美国产日韩中文字幕| 一区二区三区在线视频播放| 欧美一区二区三区免费视| 久久久久国产成人精品亚洲午夜| 欧美大片免费久久精品三p| 午夜精品一区二区在线观看| 亚洲精品午夜精品| 久久久精品国产免费观看同学| 久久久久国产免费免费| 久久国产毛片| 免费视频亚洲| 欧美成人午夜激情在线| 久久动漫亚洲| 开元免费观看欧美电视剧网站| 久久精品视频导航| 久久精品30| 亚洲区在线播放| 亚洲日本aⅴ片在线观看香蕉| 亚洲精品国精品久久99热一| 午夜在线观看欧美| 亚洲欧美日韩精品综合在线观看| 久久亚洲美女| 中文av一区特黄| 国产伦精品一区二区三区在线观看| 欧美理论在线| 欧美日韩视频专区在线播放| 亚洲欧洲日产国码二区| 欧美精品网站| 伊人久久噜噜噜躁狠狠躁| 国内久久精品| 性色av一区二区三区| 一区在线视频| 欧美在线观看一区二区三区| 国产最新精品精品你懂的| 国产精品剧情在线亚洲| 欧美日韩免费看| 欧美日韩一区二区三区在线| 欧美在线三级| 激情偷拍久久| 久久综合久久综合九色| 国产精品视区| 亚洲欧美激情诱惑| 伊人一区二区三区久久精品| 伊人久久大香线| 国产精品成人久久久久| 在线播放亚洲| 欧美在线精品免播放器视频| 亚洲欧美日韩精品一区二区| 欧美日本精品在线| 欧美日韩在线亚洲一区蜜芽| 国产精品久久久久久久久久尿| 国产午夜亚洲精品理论片色戒| 久久免费观看视频| 亚洲精品国产精品国自产观看浪潮| 亚洲电影天堂av| 欧美日本亚洲| 狠狠爱www人成狠狠爱综合网| 久久香蕉国产线看观看网| 尤物在线观看一区| 老司机免费视频一区二区三区| 欧美屁股在线| 欧美专区第一页| 国产精品一香蕉国产线看观看| 欧美成人视屏| 免费日韩精品中文字幕视频在线| 欧美一区二区三区在线免费观看| 国产区在线观看成人精品| 欧美视频在线观看视频极品| 欧美一区三区二区在线观看| 国产精品久久国产精麻豆99网站| 国产综合色精品一区二区三区| 久久亚洲风情| 99精品久久免费看蜜臀剧情介绍| 精久久久久久| 韩国在线视频一区| 亚洲精品欧美| 久久久999精品| 亚洲国产成人久久综合| 欧美日韩色婷婷| 黑人操亚洲美女惩罚| 久久综合九九| 久久精品亚洲精品国产欧美kt∨| 欧美日韩精品一二三区| 免费永久网站黄欧美| 国产精品免费福利| 久久久久青草大香线综合精品| 亚洲精品在线观| 亚洲欧洲一区二区在线观看| 欧美日产一区二区三区在线观看| 国产综合色产在线精品| 伊人一区二区三区久久精品| 在线成人免费视频| 国产欧美一区二区精品仙草咪| 久久精品视频免费观看| 欧美在线免费视频| 亚洲大黄网站| 国产精品系列在线| 欧美视频1区| 久热精品视频在线观看一区| 亚洲欧洲中文日韩久久av乱码| 欧美尤物巨大精品爽| 久久综合影视| 国产精品日韩欧美一区二区三区| 国产精品永久免费观看| 欧美三区免费完整视频在线观看| 国产精品一区免费在线观看| 在线视频中文亚洲| 99精品久久免费看蜜臀剧情介绍| 久久久久免费观看| 亚洲精品三级| 久久久999精品| 欧美日韩精品免费观看视频| 欧美一区国产二区| 999在线观看精品免费不卡网站| 日韩一区二区久久| 欧美日韩美女在线观看| 国产精品美女一区二区在线观看| 亚洲第一页自拍| 国产精品久久久久av免费| 亚洲校园激情| 国产欧美一区二区精品性| 午夜精品久久久久久99热软件| 国产三级欧美三级| 欧美另类高清视频在线| 在线观看一区欧美| 国产日韩精品在线观看| 久久久久女教师免费一区| 国产精品magnet| 久久久av水蜜桃| 黄色精品网站| 亚洲深爱激情| 国产精品九九| 亚洲欧美日韩电影| 欧美激情中文不卡| 一区二区精品国产| 亚洲毛片在线观看.| 欧美午夜精品理论片a级按摩| 欧美午夜精品久久久久久浪潮| 亚洲国产欧美一区二区三区久久| 欧美影院在线播放| 女人香蕉久久**毛片精品| 免费观看成人www动漫视频| 国产精品久久久爽爽爽麻豆色哟哟| 国产亚洲精品7777| 另类综合日韩欧美亚洲| 久久激情综合| 国产精品视频免费| 99re成人精品视频| 国产一区二区按摩在线观看| 久久婷婷蜜乳一本欲蜜臀| 欧美日韩裸体免费视频| 国产精品久久久久aaaa樱花| 美女视频黄a大片欧美| 久久人人爽国产| 国产精品素人视频| 在线观看欧美日韩| 午夜精彩视频在线观看不卡| 亚洲美女av在线播放| 国产精品揄拍500视频| 久久香蕉国产线看观看网| 黄色国产精品一区二区三区| 欧美激情按摩| 亚洲精美视频| 欧美久久久久中文字幕| 一区在线视频| 欧美成人情趣视频| 在线精品亚洲| 国产一区二区无遮挡| 国产精品二区三区四区| 欧美日韩免费一区二区三区| 在线成人av网站| 影音先锋日韩资源| 欧美精品色综合| 欧美午夜宅男影院在线观看| 欧美午夜宅男影院在线观看| 蜜桃av一区| 在线观看欧美一区| 精品91免费| 国产精品99久久久久久人| 亚洲精品1区|