BIO,NIO,AIO介紹

1. BIO(同步 , 阻塞)
BIO是Java1.4之前所使用的一個 同步並阻塞形 IO , 原因是 Socket是阻塞的, 從serverSocket的accept就開始阻塞 ,到 read方法也是阻塞的 .

改進方式:
1.使用while循環解決 客戶端多請求問題
2.使用多線程解決 客戶端併發問題
可以使用線程池來實現解決併發問題 但是有很大的侷限性:1. 得確切的知道客戶端的請求數量從而構造多少條線程. 2. 如果請求數量過多 則會導致cup 大量的資源耗費在線程的切換中.
2. NIO(同步, 非阻塞)

圖解:
在這裏插入圖片描述

1:客戶端通過ip和端口找到服務器端,操作系統內核先處理
2:操作系統內核通知Selector,有客戶端請求連接
3:Selector向內核註冊連接建立的監聽
4:內核發現有人能處理這個連接,於是開始和客戶端建立連接
5:連接成功,通知Selector,同時創建channel
6:客戶端發送數據,放入緩衝區。
7:Channel 不會直接處理字節數據,而是通過 Buffer 對象來處理數據
8:Selector會不斷 輪詢註冊在其上的 Channel,如果某個 Channel 上面發生讀或者寫事件,這個 Channel 就處於就緒狀態,會被 Selector 輪詢出來,進行後續的 I/O 操作
小結:
1:nio模式中整個過程服務器都沒有被阻塞
2:bio是傻傻地等待客戶端來連,而nio不等,有連接來了告訴我。所以nio能一次性處理多個客戶端請求,一個客戶端對應一個channel
3:bio是傻傻等待客戶端發數據,而nio不等,通過輪詢感知channel是否有數據流。
名詞解釋
NIO 三大核心部分:Channel(通道),Buffer(緩衝區), Selector(選擇器)。

Buffer :容器對象,包含一些要寫入或者讀出的數據。在 NIO 庫,所有數據都是用緩衝區處理的。在讀取數據時,它是直接讀到緩衝區中的;在寫入數據時,也是寫入到緩衝區中。任何時候訪問 NIO 中的數據,都是通過緩衝區進行操作。

Channel :通道對象,對數據的讀取和寫入要通過 Channel,它就像水管一樣。通道不同於流的地方就是通道是雙向的,可以用於讀、寫和同時讀寫操作。Channel 不會直接處理字節數據,而是通過 Buffer 對象來處理數據。

Selector: :多路複用器,選擇器。提供選擇已經就緒的任務的能力。Selector會不斷 輪詢註冊在其上的 Channel,如果某個 Channel 上面發生讀或者寫事件,這個 Channel 就處於就緒狀態,會被 Selector 輪詢出來,進行後續的 I/O 操作。這樣服務器只需要一兩個線程就可以進行多客戶端通信。
3. AIO (異步, 非阻塞)

圖解:

在這裏插入圖片描述 1:客戶端通過ip和端口找到服務器端,操作系統內核先處理 2:操作系統內核通知Selector,有客戶端請求連接 3:Selector向內核註冊連接建立的監聽 4:內核發現有人能處理這個連接,於是開始和客戶端建立連接 5:連接成功,通知Selector,同時創建channel 6:Selector沒有立馬去讀數據,而是註冊讀數據的監聽 7:客戶端發送數據,在內核中緩存。 8:內核通知Selector有數據流。 9:Selector通過channel讀取數據。