NIO基礎瞭解
是jdk1.4出現的新的流.
BIO - Blocking IO - 同步式阻塞式IO --- UDP/TCP
NIO - New IO - 同步式非阻塞式IO
AIO - AsynchronousIO - 非同步式非阻塞式IO - jdk1.8
BIO的缺點:
- 會產生阻塞行為 --- receive/accept/connect/read/write
- 一對一的連線:每連線一個客戶端,在伺服器端就需要開啟一個執行緒去處理請求.在客戶端較多的情況下,伺服器端就會產生大量的執行緒 - 耗費記憶體
- 連線建立之後如果不發生任何的操作.那麼就會導致伺服器中的這個執行緒依然被佔用,耗費伺服器的資源
- 無法實現定點操作
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的優勢:
- 非阻塞:提高傳輸效率
- 一對多的連線:可以用一個或者少量的伺服器中的執行緒來處理大量的請求,從而節省伺服器的記憶體資源
- 即使已經建立連線,只要沒有對應的讀寫事件,那麼依然不能夠使用伺服器來進行處理
- 利用通道實現資料的雙向傳輸
- 因為利用緩衝區來儲存資料,所以可以對緩衝區中的資料實現定點操作