以 Java NIO 的角度理解 Netty

文章目錄

  • 前言
  • Java NIO 工作原理
  • Selector 的創建
  • ServerSocketChannel 的創建
  • ServerSocketChannel 注冊 Selector
  • 對事件的處理
  • 總結

前言

上篇文章《Netty 入門指南》主要涵蓋了 Netty 的入門知識,包括 Netty 的發展歷程、核心功能與組件,并且通過實例演示了如何使用 Netty 構建一個 HTTP 服務器。由于 Netty 的抽象程度較高,因此理解起來可能會更加復雜和具有挑戰性,所以本文將通過 Java NIO 的處理流程與 Netty 的總體流程比較,并結合 Netty 的源碼更加清晰地理解Netty。

Java NIO 工作原理

首先我們知道Netty是基于Java NIO的一個網絡應用框架,是在其基礎上進行封裝和擴展(所以在深入了解Netty之前,建議先對Java NIO有一定的了解),所以二者對網絡的連接、讀取和寫入的操作方式是相似的。
Java NIO 工作原理
Java NIO代碼示例

如上圖的Java NIO的處理流程,與Java NIO代碼示例結合,可以看到,將 ServerSocketChannel 注冊到 Selector 并監聽各個事件后,Selector 在接受到事件請求后我們業務代碼對其進行判斷并對應處理,在使用Netty時我們似乎不需要寫這些代碼,甚至都沒有看見SelectorServerSocketChannel這些字眼,那這些代碼在Netty中怎么體現的,我們扒開褲子看個究竟:
在這里插入圖片描述
以上文Netty構建的HTTP服務器示例為例,直接關注 ServerSocketChannelSelector 是什么時候創建的,事件是什么時候注冊以及處理的。

Selector 的創建

其實看了上篇的Netty入門,可以知道 EventLoop 負責處理各種事件,所以可以盲猜一下,Selector 應該是在 NioEventLoopGroup 中創建的,look

在這里插入圖片描述
NioEventLoopGroup 的構造方法中調用 JDK 的 SelectorProvider 創建了Selector,也就是 Java NIO 的代碼。

ServerSocketChannel 的創建

關于 ServerSocketChannel 的創建,直接找綁定端口的方法,如下圖
在這里插入圖片描述

同樣,在 Netty 的代碼 NioServerSocketChannelnewChannel() 中也看到 Java NIO 的代碼。

ServerSocketChannel 注冊 Selector

下圖中 ServerSocketChannel 在創建后為其分配了一個 EventLoop 并開啟新的線程(這也是Netty 多線程異步的體現),最終在 doRegister() 調用了JDK 的接口注冊了Selector 并監聽了事件,看見 selectionKey 應該什么都清楚了吧。
在這里插入圖片描述

對事件的處理

既然 ServerSocketChannel 注冊了Selector 并監聽了事件,那接下來就是當有事件來時 EventLoop 對其進行處理,直接看 NioEventLoop 中的代碼,因為他是通過新的線程啟動的,所以直接看 run()
在這里插入圖片描述
processSelectedKeysPlain() 中的代碼熟悉吧,是監聽到了某個事件可以進行處理了,下面是對讀事件的處理
在這里插入圖片描述
圖中 ChannelPipeline 采用了責任鏈模式是對事件的處理通道,方便擴展。所以 Netty 中的讀取事件與 Java NIO 的關系如下圖。

在這里插入圖片描述

總結

所以在接觸 Netty 的之前一定要先掌握 Java NIO,本文只是介紹了 Java NIO 在 Netty 中的體現、Netty 對 Java NIO 的封裝,讓大家更方便的理解 Netty,并不涉及 Netty 的高效、強大的設計之處,下文將會對此進行介紹。

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

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

相關文章

rabbitmq的發布確認

生產者將信道設置成 confirm 模式,一旦信道進入 confirm 模式, 所有在該信道上面發布的 消息都將會被指派一個唯一的 ID (從 1 開始),一旦消息被投遞到所有匹配的隊列之后,broker 就會發送一個確認給生產者(包含消息的唯一 ID)&…

AI巨浪下,數據技術如何驅動智能未來?

引言 數據技術是大數據時代的核心驅動力,也是推動各行各業數字化轉型和智能化升級的關鍵因素。隨著云計算、人工智能、區塊鏈等新興技術的不斷發展和融合,數據技術也呈現出多模態、混合處理、自動化管理等新的趨勢和特點。 8 月 19 日(周六&…

域名和ip的關系

域名和ip的關系 一:什么是域名 域名,簡稱域名、網域,是由一串用點分隔的名字組成的上某一臺計算機或計算機組的名稱,用于在數據傳輸時標識 計算機的電子方位(有時也指地理位置)。網域名稱系統,有時也簡稱為域名…

【寶藏系列】嵌入式 C 語言代碼優化技巧【超詳細版】

【寶藏系列】嵌入式 C 語言代碼優化技巧【超詳細版】 文章目錄 【寶藏系列】嵌入式 C 語言代碼優化技巧【超詳細版】前言整形數除法和取余數合并除法和取余數通過2的冪次進行除法和取余數取模的一種替代方法使用數組下標全局變量使用別名變量的生命周期分割變量類型局部變量指針…

Centos下的tcpdump抓包用法

先查一下是否安裝, 無的話裝一下 (版本低的用yum install) : rpm -qa tcpdump dnf install tcpdump 1. 列出能抓包的網卡: tcpdump -D | --list-interfaces 2. 在eth0網卡上抓來源為10.1.1.1 的包, 只抓一個包 (-n這里是不解析DNS) : tcpdump -i eth0 -n src 10.1.1.1 -…

STM32 F103C8T6學習筆記3:串口配置—串口收發—自定義Printf函數

今日學習使用STM32 C8T6的串口,我們在經過學習筆記2的總結歸納可知,STM32 C8T6最小系統板上有三路串口,如下圖: 今日我們就著手學習如何配置開通這些串口進行收發,這里不講串口通信概念與基礎,可以自行網上…

一文讀懂HTML

文章目錄 HTML的歷史HTML的作用HTML的基本語言 HTML的歷史 HTML(HyperText Markup Language)的歷史可以追溯到20世紀90年代早期,它是互聯網發展的重要里程碑之一。以下是HTML的歷史概述: 早期階段(1980年代末 - 1990年…

FLatten Transformer 簡化版Transformer

今天在找論文時,看到一篇比較新奇的論文,在這里跟大家分享一下,希望可以給一些人提供一些思路。雖然現在Transformer 比較火,在分割上面也應用的比較多,但是我一直不喜歡用,其中一個原因是結構太復雜了&…

golang官方限流器rate包實踐

日常開發中,對于某些接口有請求頻率的限制。比如登錄的接口、發送短信的接口、秒殺商品的接口等等。 官方的golang.org/x/time/rate包中實現了令牌桶的算法。 封裝限流器可以將ip、手機號這種的作為限流器組的標識。 接下來就是實例化限流器和獲取令牌函數的實現…

C++:模擬實現list及迭代器類模板優化方法

文章目錄 迭代器模擬實現 本篇模擬實現簡單的list和一些其他注意的點 迭代器 如下所示是利用拷貝構造將一個鏈表中的數據挪動到另外一個鏈表中&#xff0c;構造兩個相同的鏈表 list(const list<T>& lt) {emptyinit();for (auto e : lt){push_back(e);} }void test_…

運動路徑規劃,ROS發布期望運動軌跡

目錄 一、Python實現&#xff08;推薦方法&#xff09; 1.1代碼cubic_spline_path.py 1.2使用方法 二、C實現 參考博客 想讓機器人/智能車無人駕駛&#xff0c;要有期望路徑&#xff0c;最簡單的是一條直線&#xff0c;或者是一條光滑曲線。 生成路徑的方法有兩種&#xf…

【網絡編程(二)】NIO快速入門

NIO Java NIO 三大核心組件 Buffer&#xff08;緩沖區&#xff09;&#xff1a;每個客戶端連接都會對應一個Buffer&#xff0c;讀寫數據通過緩沖區讀寫。Channel&#xff08;通道&#xff09;&#xff1a;每個channel用于連接Buffer和Selector&#xff0c;通道可以進行雙向讀…

Linux下C++開發

Linux下C開發 Linux 系統介紹 簡介 Linux屬于多用戶多任務操作系統&#xff0c;而Windows屬于單用戶多任務操作系統Linux一切皆文件目錄結構 bin 存儲二進制可執行文件dev 存放的是外接設備&#xff0c;例如磁盤&#xff0c;光盤等。在其中的外接設備是不能直接被使用的&…

Redis數據庫的可視化工具AnotherRedisDesktopManager使用+抖音直播小玩法實踐

一、它是什么 Another Redis DeskTop Manager 是一個開源項目&#xff0c;提供了以可視化的方式管理 Redis 的功能&#xff0c;可供免費下載安裝&#xff0c;也可以在此基礎上進行二次開發&#xff0c;主要特點有&#xff1a; 支持 Windows 平臺和 MacOS 平臺 支持查詢 Key、…

2023-08-17力扣每日一題

鏈接&#xff1a; 1444. 切披薩的方案數 題意&#xff1a; 給定一個矩陣&#xff0c;其中含有多個蘋果&#xff0c;需要切割k-1次,每次可以切割多行/多列&#xff0c;需要保證切割兩個部分都有蘋果&#xff0c;移除靠上/靠右的部分&#xff0c;對留下部分進行后續的切割&…

QT中的按鈕控件Buttons介紹

目錄 Buttons 按鈕控件 1、常用屬性介紹 2、按鈕介紹 2.1QPushButton 普通按鈕 2.2QtoolButton 工具按鈕 2.3Radio Button單選按鈕 2.4CheckButton復選按鈕 2.5Commam Link Button命令鏈接按鈕 2.6Dialog Button Box命令鏈接按鈕 Buttons 按鈕控件 在Qt里&#xff0c;…

Viobot開機指南

0.前言 本篇旨在讓每個拿到Viobot設備的用戶都能夠第一時間測試它的效果&#xff0c;以及將設備配置到自己的環境下面。 1.上電 首先&#xff0c;我們先要把設備接上電源線和網線&#xff0c;最簡單的方式就是網線直連電腦。 電源選用12V1.5A設備自帶的電源即可。 2.配置網…

JavaScript中的this指向,call、apply、bind的簡單實現

JavaScript中的this this是JavaScript中一個特殊關鍵字&#xff0c;用于指代當前執行上下文中的對象。它的難以理解之處就是值不是固定的&#xff0c;是再函數被調用時根據調用場景動態確定的&#xff0c;主要根據函數的調用方式來決定this指向的對象。this 的值在函數被調用時…

深入學習前端開發,掌握HTML、CSS、JavaScript等技術

課程鏈接&#xff1a; 鏈接: https://pan.baidu.com/s/1WECwJ4T8UQfs2FyjUMbxig?pwdi654 提取碼: i654 復制這段內容后打開百度網盤手機App&#xff0c;操作更方便哦 --來自百度網盤超級會員v4的分享 課程介紹&#xff1a; 第1周&#xff1a;HTML5基礎語法與標簽 &#x1f…

web集群學習:搭建 LNMP應用環境

目錄 LNMP的介紹&#xff1a; LNMP組合工作流程&#xff1a; FastCGI介紹&#xff1a; 1、什么是 CGI 2、什么是 FastCGI 配置LNMP 1、部署LNMP環境 2、配置LNMP環境 LNMP的介紹&#xff1a; 隨著 Nginx Web 服務的逐漸流行&#xff0c;又岀現了新的 Web 服務環境組合—…