成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
本文只是介紹了 Java NIO 在 Netty 中的體現、Netty 對 Java NIO 的封裝,讓大家更方便的理解 Netty,并不涉及 Netty 的高效、強大的設計之處,下文將會對此進行介紹。

前言

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

Java NIO 網絡編程流程

首先,我們知道 Netty 是基于 Java NIO API 封裝擴展的一個網絡編程框架,所以二者的網絡編程工作流程是大差不差的。

(所以在深入了解Netty之前,建議先對Java NIO有一定的了解)

下圖是基于Java NIO API進行網絡編程時的工作流程。涉及到的Selector、Channel、Buffer這幾個組件,《Java NIO是New IO還是Non-blocking IO》中有詳細說明。

Java NIO 工作原理Java NIO 工作原理

Netty 編碼 VS  Java NIO API 編碼

Netty 同樣會用到這些核心組件,只不過再一次抽象封裝后,不能直觀的看到這些組件。

先看下基于Java NIO API編程是怎么編寫代碼的。

Java NIO代碼示例Java NIO代碼示例

可以看到, ServerSocketChannel 注冊到 Selector 并監聽連接事件,當 Selector 接收到連接的客戶端 Channel 后,又監聽 Channel 的讀寫事件,那么下次 Selector 就會接收到客戶端的讀寫事件并進行處理。

再看一下基于Netty構建的HTTP服務器示例。

Netty 編程Netty 編程

能看到的就只有一個對客戶端讀請求處理的 channelRead0 函數,Selector、ServerSocketChannel這些都沒看到。

那么 ServerSocketChannel 、Selector 在哪里?事件是什么時候注冊的?我們扒開褲子看個究竟。

Netty 對 Java NIO API 的封裝

接下來,看一下Netty是怎么對Java NIO API進行封裝的。

ServerSocketChannel 在 Netty 中的體現

關于 ServerSocketChannel 的創建,直接找綁定端口的方法,如下圖

圖片圖片

在  NioServerSocketChannel 類中可以看到 newChannel() 函數創建了 ServerSocketChannel 。

Selector 在 Netty 中的體現

看了上文《聽說96.5%的程序員都沒用過Netty》,可以知道 EventLoop 負責處理各種事件,所以可以盲猜一下,Selector 應該是在 NioEventLoopGroup 中創建的

圖片圖片

果不其然,在 NioEventLoopGroup 的構造方法中調用 JDK 的 SelectorProvider 創建了Selector,也就是 Java NIO 的代碼。

事件注冊在 Netty 中的體現

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

圖片圖片

事件處理在 Netty 中的體現

既然 ServerSocketChannel 注冊了Selector 并監聽了事件,那接下來就是 EventLoop  對事件的處理了。直接看 NioEventLoop 中的代碼,因為他是通過新的線程啟動的,所以直接看 run()

圖片圖片

processSelectedKeysPlain() 中的代碼熟悉吧,Selector 監聽到了某個事件進行處理。下面是對讀事件的處理

圖片圖片

圖中 ChannelPipeline 采用了責任鏈模式,是對事件的處理通道,會對聲明時的ChannelPipeline依次執行,也就是圖[Netty 編程]中的p.addlast。

Netty 網絡編程流程

最后,通過一張圖梳理下 Netty 的工作流程,并體現和 Java NIO API的關系。

圖片圖片

總結

在接觸 Netty 的之前一定要先掌握 Java NIO,不然云里霧里的。

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

本文轉載自微信公眾號「Hi程序員」,可以通過以下二維碼關注。轉載本文請聯系Hi程序員公眾號。

責任編輯:武曉燕 來源: Hi程序員
相關推薦

2011-12-08 08:58:28

JavaScript

2012-11-14 09:48:57

HBase大數據

2014-07-09 16:58:38

WIFI

2022-07-05 11:17:46

零信任安全技術網絡安全

2012-11-14 08:57:29

HBase

2010-09-02 09:32:26

私有云

2013-01-25 11:17:17

Gartner大數據傳感器

2009-08-03 14:09:13

SAP中國真相SAP

2019-12-02 12:50:52

LiFiWiFi通信網絡

2011-03-31 09:40:58

2012-09-19 13:47:53

HTML5

2011-02-18 14:43:21

人才

2016-06-07 13:53:43

ios蘋果概念

2010-06-25 09:19:18

云計算應用

2011-05-16 10:10:51

2020-12-16 07:51:42

項目個人博客支付

2011-10-11 09:33:11

計算機工作

2021-03-01 14:47:00

Linux LiteWindows發行版

2020-12-02 15:03:48

工具 UI 開發

2016-10-19 09:17:15

HTML5Javascript可視化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品在线观看网站 | 日韩欧美一二三区 | 亚洲精品久久久蜜桃 | 精品自拍视频 | 最新日韩av| 久久丁香| 一区二区三区四区免费在线观看 | 一区二区成人 | 亚洲人成人一区二区在线观看 | 午夜在线观看视频 | 国产精品一区二区在线免费观看 | 91免费版在线观看 | 欧美精品在线一区 | 99视频在线免费观看 | 中文字幕av网站 | 最新中文字幕在线播放 | 91在线精品秘密一区二区 | 欧美一区二区免费 | 日本三级全黄三级a | 亚洲男女激情 | 羞羞视频在线观看免费观看 | 天天操天天操 | 不卡av电影在线播放 | 午夜性视频| 狠狠爱综合 | 日韩精品成人一区二区三区视频 | 欧美日韩一区二区在线观看 | 日韩精品一区二区三区中文字幕 | 日韩在线观看 | 九九九久久国产免费 | 国产精品欧美精品 | 9191av| www.色综合 | 国产做a爱片久久毛片 | 久久婷婷国产麻豆91 | 色偷偷噜噜噜亚洲男人 | 午夜成人免费视频 | 一区二区三区电影网 | 成人午夜av | 玖玖操 | 淫片一级国产 |