1. 程式人生 > >Netty權威指南_札記02_NIO程式設計

Netty權威指南_札記02_NIO程式設計

文章目錄


1. NIO

NIO為非阻塞I/O(Non-block I/O)
與Socket類和ServerSocket類相對應,NIO也提供了SocketChannelServerSocketChannel兩種不同的套接字通道實現,均支援阻塞和非阻塞兩種模式。
對於高負載、高併發的網路應用,需要使用NIO的非阻塞模式進行開發。

2. NIO類庫

2.1 緩衝區Buffer

在面向流的I/O中,可以將資料直接寫入或者將資料直接讀出到Stream物件中。
緩衝區實質上是一個數組,最常用的位元組陣列(ByteBuffer)。緩衝區提供了對資料的結構化訪問以及維護讀寫位置(limit)的資訊。
緩衝區包括:

  • ButeBuffer: 位元組緩衝區
  • CharBuffer: 字元緩衝區
  • ShortBuffer: 短整型緩衝區
  • IntBuffer: 整型緩衝區
  • LongBuffer: 長整型緩衝區
  • FloatBuffer: 浮點型緩衝區
  • DubleBuffer: 雙精度浮點型緩衝區

2.2 通道Channel

Channel是一個通道,網路資料通過Channel讀取和寫入。通道和流不同之處在於通道是雙向的流是單向的
因為Channel是全雙工的,可以比流更好的對映底層作業系統的API。
Channel可以分為兩大類:

  • 用於網路讀寫的SelectableChannel
  • 用於檔案操作的FileChannel

SocketChannelServerSocketChannel都是SelectableChannel的子類。

2.3 多路複用器Selector

多路複用器Selector是Java NIO程式設計的基礎,多路複用器提供選擇已經就緒的任務的能力。
Selector會不斷的輪詢註冊在其上的Channel,如果某個Channel上面發生讀或者寫事件,這個Channel就處於就緒狀態,會被Selector輪詢出來,然後通過SelectionKey可以獲取就緒Channel的集合,進行後續的I/O操作。
一個多路複用器Selector可以同時輪詢多個Channel,由於JDK使用了epoll()代替傳統的select實現,所以它並沒有最大連線控制代碼1024/2048 的限制。這意味著只需要一個執行緒負責Selector的輪詢,就可以接入成千上萬的客戶端。