1. 程式人生 > >NIO基礎瞭解

NIO基礎瞭解

是jdk1.4出現的新的流.

BIO - Blocking IO - 同步式阻塞式IO --- UDP/TCP

NIO - New  IO - 同步式非阻塞式IO

AIO  - AsynchronousIO - 非同步式非阻塞式IO - jdk1.8

BIO的缺點:

  1. 會產生阻塞行為 --- receive/accept/connect/read/write
  2. 一對一的連線:每連線一個客戶端,在伺服器端就需要開啟一個執行緒去處理請求.在客戶端較多的情況下,伺服器端就會產生大量的執行緒 - 耗費記憶體
  3. 連線建立之後如果不發生任何的操作.那麼就會導致伺服器中的這個執行緒依然被佔用,耗費伺服器的資源
  4. 無法實現定點操作

NIO

三個基本的元件:Buffer-緩衝區, Channel-通道, Selector-多路複用選擇器

Buffer - 緩衝區

容器 - 儲存資料 - 在底層儲存資料的時候實際上是以陣列形式來儲存

capacity - 容量位 - 指定緩衝區的容量

limit - 限制位 - 限制操作位所能達到的尺度

position - 操作位 - 指定要操作的位置

mark - 標記位 - 標記位置,認為標記位置之前的資料是已經操作過的沒有錯誤的資料

mark <= position <= limit <= capacity

flip - 反轉緩衝區:先將限制位挪到操作位上, 然後將操作位歸零, 清空標記位

clear - 清空緩衝區: 將操作位歸零,將limit挪到capacity,將標記位清空

reset - 重置緩衝區: 將操作位挪到標記位

rewind - 重繞緩衝區: 將操作位歸零,將標記位清空 --- 緩衝區多次讀取

Channel - 通道

傳輸資料 - 是面向緩衝區的。在java中,Channel預設也是阻塞的,需要手動將其設定為非阻塞模式。

BIO: File、UDP - DatagramSocket、TCP - Socket, ServerSocket

NIO: FileChannel、UDP - DatagramChannel、TCP - SocketChannel, ServerSocketChannel

FileChannel - 操作檔案,可以利用通道實現相同平臺之間的零拷貝技術。

Selector - 多路複用選擇器

進行選擇 - 是面向通道進行操作。要求通道在使用的時候必須設定為非阻塞

客戶端

可連線,可讀、可寫

服務端

可接受,可讀,可寫

通過Selector可以實現利用同一個伺服器端來處理多個客戶端的資料 --- 可以用少量執行緒處理大量的請求 --- 在底層處理的時候實際上依然是同步的

NIO的優勢:

  1. 非阻塞:提高傳輸效率
  2. 一對多的連線:可以用一個或者少量的伺服器中的執行緒來處理大量的請求,從而節省伺服器的記憶體資源
  3. 即使已經建立連線,只要沒有對應的讀寫事件,那麼依然不能夠使用伺服器來進行處理
  4. 利用通道實現資料的雙向傳輸
  5. 因為利用緩衝區來儲存資料,所以可以對緩衝區中的資料實現定點操作