Nio程式設計詳解

2021-10-11 21:34:22 字數 921 閱讀 9983

nio程式設計

1.傳統的網路程式設計

在tcp協議中,呼叫accept函式時,會阻塞在那裡,而且每次都需要建立乙個新的執行緒來處理該連線,用這種方式當連線數較多時會產生大量的執行緒,而執行緒之間的切換需要耗費資源,上限較低。

2.所以我們需要引入nio(非阻塞io程式設計)

nio程式設計的實現方式

1.幾個核心元件

在這裡插入描述

這麼看很抽象。舉個栗子。

selector理解為班長,read/write看做交作業/拿作業,每個channel意味著乙個同學,selectionkey代表事件類別,每次只能有乙個人交/拿作業,每個人需要事先告訴班長自己是拿作業還是寫作業(事件的類別),每個人告訴班長自己是要拿作業還是交作業,班長知道後,根據事件類別得到每個具體的人,然後進行拿/交作業的操作。

channel

通道 可以形象地理解成連線客戶端和服務端的乙個道路,雙方通過這個傳送和接受資料。分為serversocketchannel類和socketchannel,二者的功能類似於serversocket和socket,serversocketchannel是用來監聽服務端的連線的,成功會返回乙個socketchannel。

buffer

緩衝區,存放資料的地方。我們要把放在通道中的東西讀出來,就要放到buffer中。

selector

實現非阻塞的關鍵元件。channel需要註冊到selector上,selector會對註冊channel進行監聽。

NIO程式設計

1.客戶端關閉 的時候會拋異常 死迴圈 int read channel.read buffer if read 0 else 客戶端關閉 key.cancel 登出當前key 2.selector.select 阻塞 為什麼說nio 是非阻塞的io selector.select selector...

NIO網路程式設計

nio buffer陣列緩衝區 獲取物件 allocate int capacity allocatedirect int capacity wrap byte byte 常用方法 put 新增元素 capacity 容量 陣列的大小 position 位置 要存放元素位置,每操作乙個元素,位置就會...

NIO原理詳解 二

capacity buffer陣列的長度,容量 limit buffer的可操作範圍 mark position 當前的位置,下標 get,put獲取buffer資料 get 方法,put方法 clean 方法 filp 方法 固定狀態,當前範圍的資料不允許進行寫入操作,只允許讀操作,詳細理解如下圖...