NIO簡單理解(一,NIO服務端簡單實現邏輯)

2021-08-07 02:27:10 字數 1193 閱讀 1952

熟悉nio,首先要理解nio核心物件

serversocketchannel

selector:是乙個多路開關選擇器,可以同時檢查(如果需要,也可以等待)一組通道的i/o狀態,能夠管理多個通道上的i/o操作。

簡單nio服務端為例實現邏輯:

建立selector(多路開關選擇器或者通道管理器),

(幹的事就是收集請求,分發任務)。

需要下列連個核心物件

serversocketchannel: 通訊通道  

selectionkey:對應通道上匹配並可以處理的哪種事件(包含四種列舉事件)

selector例項物件設定: (規定好要監聽報告的事件,這個只監聽新連線事件)

1 開啟乙個服務端的通道:

serversocketchannel ssc = serversocketchannel.open();

2 繫結socket埠ssc.socket().bind

3 註冊繫結selector 到通道,將selector例項(selector.open()獲取)註冊(register  1:n)到想要監控的通道上

serversocketchannel.register(connectionbell.getselector(), selectionkey.op_accept);

(注意, 這要通過channel的方法實現,而不是使用selector的方法)

4 開啟selector監控連線專用線程(內部while(true)自旋)

new thread(connectionbell).start();

5 專用線程內部可以做的事:

服務端selector例項核心輪詢 獲取通道事件,this.selector.select();該方法阻塞等待或者超時

通過通道事件找到對應通道,獲取該通道及客戶端請求資訊

serversocketchannel ssc = (serversocketchannel) key.channel();

開啟多執行緒:dispatch分發處理請求

6  客戶端nio序列圖  

7 服務端nio序列圖

nio 阻塞式檔案傳輸服務端

1.獲取服務端網路通道 serversocketchannel sschannel serversocketchannel.open 2.為服務端網路通道繫結位址 埠 sschannel.bind new inetsocketaddress 127.0.0.1 8989 3.獲取客戶端連線的通道 s...

NIO小練習,編寫服務端和客戶端

將服務端和客戶端註冊到selector,利用緩衝區進行資料的傳輸,具體 和注釋如下 服務端 public class nioserver 如果返回大於0 則獲得有事件發生的selectionkey 通過selectionkey反向獲取通道 setselectionkeys selector.sele...

簡單理解io與nio

io是面向流的,而nio是面向緩衝區的 io每次從流中讀取乙個或者多個位元組,直到讀取完所有的位元組,這就意外著它是阻塞式的,當乙個執行緒執行read或者write的時候,這個執行緒是不能夠再去做其他的事情了 nio會讀取資料放到乙個緩衝區裡,這樣可以增加讀取資料的靈活性,可以前後移動讀取資料的位置...