Netty權威指南_札記02_NIO程式設計
阿新 • • 發佈:2018-11-20
文章目錄
1. NIO
NIO
為非阻塞I/O(Non-block I/O)
與Socket類和ServerSocket類相對應,NIO也提供了SocketChannel
和ServerSocketChannel
兩種不同的套接字通道實現,均支援阻塞和非阻塞兩種模式。
對於高負載、高併發的網路應用,需要使用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
SocketChannel
和ServerSocketChanne
l都是SelectableChannel
的子類。
2.3 多路複用器Selector
多路複用器Selector是Java NIO程式設計的基礎,多路複用器提供選擇已經就緒的任務的能力。
Selector會不斷的輪詢註冊在其上的Channel,如果某個Channel上面發生讀或者寫事件,這個Channel就處於就緒狀態,會被Selector輪詢出來,然後通過SelectionKey可以獲取就緒Channel的集合,進行後續的I/O操作。
一個多路複用器Selector可以同時輪詢多個Channel,由於JDK使用了epoll()代替傳統的select實現,所以它並沒有最大連線控制代碼1024/2048 的限制。這意味著只需要一個執行緒負責Selector的輪詢,就可以接入成千上萬的客戶端。