Netty 是基于Java NIO 封裝的網絡通訊架構,隻有充分了解了 Java NIO 才能了解好Netty的底層設計。Java NIO 由三個核心元件元件:
Buffer
Channel
Selector
Buffer 是一個資料對象,我們可以把它了解為固定數量的資料的容器,它包含一些要寫入或者讀出的資料。
在 Java NIO 中,任何時候通路 NIO 中的資料,都需要通過緩沖區(Buffer)進行操作。讀取資料時,直接從緩沖區中讀取,寫入資料時,寫入至緩沖區。NIO 最常用的緩沖區則是 ByteBuffer。下圖是 Buffer 繼承關系圖:

每一個 Java 基本類型都對應着一種 Buffer,他們都包含這相同的操作,隻不過是所處理的資料類型不同而已。
Channel 是一個通道,它就像自來水管一樣,網絡資料通過 Channel 這根水管讀取和寫入。傳統的 IO 是基于流進行操作的,Channle 和類似,但又有些不同:
差別
流
通過Channel
支援異步
不支援
支援
是否可雙向傳輸資料
不能,隻能單向
可以,既可以從通道讀取資料,也可以向通道寫入資料
是否結合 Buffer 使用
不
必須結合 Buffer 使用
性能
較低
較高
正如上面說到的,Channel 必須要配合 Buffer 一起使用,我們永遠不可能将資料直接寫入到 Channel 中,同樣也不可能直接從 Channel 中讀取資料。都是通過從 Channel 讀取資料到 Buffer 中或者從 Buffer 寫入資料到 Channel 中,如下:
簡單點說,Channel 是資料的源頭或者資料的目的地,用于向 buffer 提供資料或者讀取 buffer 資料,并且對 I/O 提供異步支援。
下圖是 Channel 的類圖
Channel 為最頂層接口,所有子 Channel 都實作了該接口,它主要用于 I/O 操作的連接配接。定義如下:
最為重要的Channel實作類為:
FileChannel:一個用來寫、讀、映射和操作檔案的通道
DatagramChannel:能通過 UDP 讀寫網絡中的資料
SocketChannel: 能通過 TCP 讀寫網絡中的資料
ServerSocketChannel:可以監聽新進來的 TCP 連接配接,像 Web 伺服器那樣。對每一個新進來的連接配接都會建立一個 SocketChannel
多路複用器 Selector,它是 Java NIO 程式設計的基礎,它提供了選擇已經就緒的任務的能力。從底層來看,Selector 提供了詢問通道是否已經準備好執行每個 I/O 操作的能力。簡單來講,Selector 會不斷地輪詢注冊在其上的 Channel,如果某個 Channel 上面發生了讀或者寫事件,這個 Channel 就處于就緒狀态,會被 Selector 輪詢出來,然後通過 SelectionKey 可以擷取就緒 Channel 的集合,進行後續的 I/O 操作。
Selector 允許一個線程處理多個 Channel ,也就是說隻要一個線程複雜 Selector 的輪詢,就可以處理成千上萬個 Channel ,相比于多線程來處理勢必會減少線程的上下文切換問題。下圖是一個 Selector 連接配接三個 Channel :
服務端
用戶端
運作結果
PS:如果你覺得文章對你有所幫助,别忘了推薦或者分享,因為有你的支援,才是我續寫下篇的動力和源泉!
作者:chenssy。一個專注于【死磕 Java】系列創作的男人
出處:https://www.cnblogs.com/chenssy/p/15259146.html
作者個人網站:https://www.cmsblogs.com/。專注于 Java 優質系列文章分享,提供一站式 Java 學習資料
目前死磕系列包括:
1. 【死磕 Java 并發】:https://www.cmsblogs.com/category/1391296887813967872(已完成)
2.【死磕 Spring 之 IOC】:https://www.cmsblogs.com/category/1391374860344758272(已完成)
3.【死磕 Redis】:https://www.cmsblogs.com/category/1391389927996002304(已完成)
4.【死磕 Java 基礎】:https://www.cmsblogs.com/category/1411518540095295488
5.【死磕 NIO】:https://www.cmsblogs.com/article/1435620402348036096
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。