天天看點

【死磕NIO】— NIO基礎詳解

Netty 是基于Java NIO 封裝的網絡通訊架構,隻有充分了解了 Java NIO 才能了解好Netty的底層設計。Java NIO 由三個核心元件元件:

Buffer

Channel

Selector

Buffer 是一個資料對象,我們可以把它了解為固定數量的資料的容器,它包含一些要寫入或者讀出的資料。

在 Java NIO 中,任何時候通路 NIO 中的資料,都需要通過緩沖區(Buffer)進行操作。讀取資料時,直接從緩沖區中讀取,寫入資料時,寫入至緩沖區。NIO 最常用的緩沖區則是 ByteBuffer。下圖是 Buffer 繼承關系圖:

【死磕NIO】— NIO基礎詳解

每一個 Java 基本類型都對應着一種 Buffer,他們都包含這相同的操作,隻不過是所處理的資料類型不同而已。

Channel 是一個通道,它就像自來水管一樣,網絡資料通過 Channel 這根水管讀取和寫入。傳統的 IO 是基于流進行操作的,Channle 和類似,但又有些不同:

差別

通過Channel

支援異步

不支援

支援

是否可雙向傳輸資料

不能,隻能單向

可以,既可以從通道讀取資料,也可以向通道寫入資料

是否結合 Buffer 使用

必須結合 Buffer 使用

性能

較低

較高

正如上面說到的,Channel 必須要配合 Buffer 一起使用,我們永遠不可能将資料直接寫入到 Channel 中,同樣也不可能直接從 Channel 中讀取資料。都是通過從 Channel 讀取資料到 Buffer 中或者從 Buffer 寫入資料到 Channel 中,如下:

【死磕NIO】— NIO基礎詳解
簡單點說,Channel 是資料的源頭或者資料的目的地,用于向 buffer 提供資料或者讀取 buffer 資料,并且對 I/O 提供異步支援。

下圖是 Channel 的類圖

【死磕NIO】— NIO基礎詳解

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 :

【死磕NIO】— NIO基礎詳解

服務端

用戶端

運作結果

【死磕NIO】— NIO基礎詳解
【死磕NIO】— NIO基礎詳解

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

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

繼續閱讀