熟悉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會讀取資料放到乙個緩衝區裡,這樣可以增加讀取資料的靈活性,可以前後移動讀取資料的位置...