日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Netty 編程看上去懵懵的...

來源: 責編: 時間:2024-03-26 17:38:08 168觀看
導讀前言上篇文章《聽說96.5%的程序員都沒用過Netty》主要涵蓋了 Netty 的入門知識,包括 Netty 的發展歷程、核心功能與組件,并且通過實例演示了如何使用 Netty 構建一個 HTTP 服務器。由于 Netty 的抽象程度較高,因此理解起

前言

上篇文章《聽說96.5%的程序員都沒用過Netty》主要涵蓋了 Netty 的入門知識,包括 Netty 的發展歷程、核心功能與組件,并且通過實例演示了如何使用 Netty 構建一個 HTTP 服務器。由于 Netty 的抽象程度較高,因此理解起來可能會比較復雜,所以本文通過對比 Java NIO API 和 Netty 的示例代碼,并結合Netty源碼進行深入剖析,從而更好的理解Netty的工作原理。Ocb28資訊網——每日最新資訊28at.com

Java NIO 網絡編程流程

首先,我們知道 Netty 是基于 Java NIO API 封裝擴展的一個網絡編程框架,所以二者的網絡編程工作流程是大差不差的。Ocb28資訊網——每日最新資訊28at.com

(所以在深入了解Netty之前,建議先對Java NIO有一定的了解)Ocb28資訊網——每日最新資訊28at.com

下圖是基于Java NIO API進行網絡編程時的工作流程。涉及到的Selector、Channel、Buffer這幾個組件,《Java NIO是New IO還是Non-blocking IO》中有詳細說明。Ocb28資訊網——每日最新資訊28at.com

Java NIO 工作原理Java NIO 工作原理Ocb28資訊網——每日最新資訊28at.com

Netty 編碼 VS  Java NIO API 編碼

Netty 同樣會用到這些核心組件,只不過再一次抽象封裝后,不能直觀的看到這些組件。Ocb28資訊網——每日最新資訊28at.com

先看下基于Java NIO API編程是怎么編寫代碼的。Ocb28資訊網——每日最新資訊28at.com

Java NIO代碼示例Java NIO代碼示例Ocb28資訊網——每日最新資訊28at.com

可以看到, ServerSocketChannel 注冊到 Selector 并監聽連接事件,當 Selector 接收到連接的客戶端 Channel 后,又監聽 Channel 的讀寫事件,那么下次 Selector 就會接收到客戶端的讀寫事件并進行處理。Ocb28資訊網——每日最新資訊28at.com

再看一下基于Netty構建的HTTP服務器示例。Ocb28資訊網——每日最新資訊28at.com

Netty 編程Netty 編程Ocb28資訊網——每日最新資訊28at.com

能看到的就只有一個對客戶端讀請求處理的 channelRead0 函數,Selector、ServerSocketChannel這些都沒看到。Ocb28資訊網——每日最新資訊28at.com

那么 ServerSocketChannel 、Selector 在哪里?事件是什么時候注冊的?我們扒開褲子看個究竟。Ocb28資訊網——每日最新資訊28at.com

Netty 對 Java NIO API 的封裝

接下來,看一下Netty是怎么對Java NIO API進行封裝的。Ocb28資訊網——每日最新資訊28at.com

ServerSocketChannel 在 Netty 中的體現

關于 ServerSocketChannel 的創建,直接找綁定端口的方法,如下圖Ocb28資訊網——每日最新資訊28at.com

圖片圖片Ocb28資訊網——每日最新資訊28at.com

在  NioServerSocketChannel 類中可以看到 newChannel() 函數創建了 ServerSocketChannel 。Ocb28資訊網——每日最新資訊28at.com

Selector 在 Netty 中的體現

看了上文《聽說96.5%的程序員都沒用過Netty》,可以知道 EventLoop 負責處理各種事件,所以可以盲猜一下,Selector 應該是在 NioEventLoopGroup 中創建的Ocb28資訊網——每日最新資訊28at.com

圖片圖片Ocb28資訊網——每日最新資訊28at.com

果不其然,在 NioEventLoopGroup 的構造方法中調用 JDK 的 SelectorProvider 創建了Selector,也就是 Java NIO 的代碼。Ocb28資訊網——每日最新資訊28at.com

事件注冊在 Netty 中的體現

ServerSocketChannel 在創建后為其分配了一個 EventLoop 并開啟新的線程(這也是Netty 多線程異步的體現),最終在 doRegister() 調用了JDK 的接口注冊了Selector 并監聽了事件,看見 selectionKey 應該什么都清楚了吧。Ocb28資訊網——每日最新資訊28at.com

圖片圖片Ocb28資訊網——每日最新資訊28at.com

事件處理在 Netty 中的體現

既然 ServerSocketChannel 注冊了Selector 并監聽了事件,那接下來就是 EventLoop  對事件的處理了。直接看 NioEventLoop 中的代碼,因為他是通過新的線程啟動的,所以直接看 run()Ocb28資訊網——每日最新資訊28at.com

圖片圖片Ocb28資訊網——每日最新資訊28at.com

processSelectedKeysPlain() 中的代碼熟悉吧,Selector 監聽到了某個事件進行處理。下面是對讀事件的處理Ocb28資訊網——每日最新資訊28at.com

圖片圖片Ocb28資訊網——每日最新資訊28at.com

圖中 ChannelPipeline 采用了責任鏈模式,是對事件的處理通道,會對聲明時的ChannelPipeline依次執行,也就是圖[Netty 編程]中的p.addlast。Ocb28資訊網——每日最新資訊28at.com

Netty 網絡編程流程

最后,通過一張圖梳理下 Netty 的工作流程,并體現和 Java NIO API的關系。Ocb28資訊網——每日最新資訊28at.com

圖片圖片Ocb28資訊網——每日最新資訊28at.com

總結

在接觸 Netty 的之前一定要先掌握 Java NIO,不然云里霧里的。Ocb28資訊網——每日最新資訊28at.com

本文只是介紹了 Java NIO 在 Netty 中的體現、Netty 對 Java NIO 的封裝,讓大家更方便的理解 Netty,并不涉及 Netty 的高效、強大的設計之處,下文將會對此進行介紹。Ocb28資訊網——每日最新資訊28at.com

Ocb28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-79445-0.htmlNetty 編程看上去懵懵的...

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 大模型應用的十種架構模式

下一篇: 使用.NET 8 Web API和Entity Framework實現CRUD操作

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 浮山县| 乌兰县| 和硕县| 平利县| 噶尔县| 房山区| 界首市| 含山县| 磐安县| 迁西县| 深圳市| 固始县| 广平县| 金川县| 长海县| 浦县| 微博| 抚宁县| 宁安市| 鄱阳县| 鹤山市| 留坝县| 文水县| 二连浩特市| 潜山县| 祥云县| 伊金霍洛旗| 拉孜县| 蓬溪县| 龙州县| 四子王旗| 禄劝| 灵武市| 鱼台县| 无锡市| 米林县| 深泽县| 松潘县| 黄平县| 保靖县| 张北县|