一、bio網(wǎng)絡(luò)模型
1.1 bio網(wǎng)絡(luò)模型示意圖
單個(gè)客戶端向服務(wù)器發(fā)起請(qǐng)求時(shí),請(qǐng)求順序如下:
多個(gè)客戶端向一個(gè)服務(wù)器發(fā)起請(qǐng)求時(shí),請(qǐng)求順序如下:
1.2 bio網(wǎng)絡(luò)模型缺點(diǎn)
1.阻塞式I/O
服務(wù)器端的線程會(huì)因?yàn)樽枞鸌/O,一直阻塞,等待客戶端的請(qǐng)求。
若客戶端一直不發(fā)起,服務(wù)端的業(yè)務(wù)線程會(huì)一直存在。
2.彈性伸縮能力差
因?yàn)橐粋€(gè)客戶端對(duì)應(yīng)一個(gè)服務(wù)端的業(yè)務(wù)線程,那么客戶端和服務(wù)端線程數(shù)是1比1的關(guān)系,再好的機(jī)器也難以承受過多的線程。
3.多線程耗費(fèi)資源
線程的創(chuàng)建銷毀、大量的線程存在服務(wù)端,服務(wù)端的cpu調(diào)度資源都會(huì)存在影響
二、NIO網(wǎng)絡(luò)模型
2.1 nio網(wǎng)絡(luò)模型示意圖
單個(gè)客戶端向服務(wù)器發(fā)起請(qǐng)求時(shí),請(qǐng)求順序如下:
2.2 nio網(wǎng)絡(luò)模型的改進(jìn)
1.非阻塞式I/O
nio模型是基于非阻塞式I/O構(gòu)建出來的,服務(wù)器端提供一個(gè)單線程的select,統(tǒng)一管理所有客戶端接入的socket鏈接,并負(fù)責(zé)監(jiān)聽每個(gè)鏈接所關(guān)心的事件。
2.彈性伸縮能力強(qiáng)
因?yàn)榉?wù)端不是多個(gè)線程來處理,而是一個(gè)線程就可以處理所有請(qǐng)求,所有客戶端和服務(wù)端線程數(shù)是1比N的關(guān)系,理論上可以接入無限的請(qǐng)求。
3.單線程節(jié)省資源
減少了線程的創(chuàng)建和銷毀,以及線程上下文的切換問題。
三、NIO核心- Channel(通道)
3.1 Channel 簡(jiǎn)介
1.雙向性
信息傳輸?shù)耐ǖ溃琷dk的nio是對(duì)輸入輸出的方式的另一種抽象,類比bio中的流的概念。
不同的是流是單向傳輸,分輸入流輸出流。而通道支持雙向傳輸,一個(gè)channel既可讀又可寫。
2.非阻塞性
傳統(tǒng)流是阻塞模式,而channel可以工作在非阻塞模式下。
3.操作唯一性
操作channel的唯一方式是buffer,通過buffer操作channel實(shí)現(xiàn)數(shù)據(jù)塊的回寫
3.2 Channel 實(shí)現(xiàn)類
1.文件類 : FileChannel - 對(duì)文件進(jìn)行讀寫的流 2.UDP類 :DatagramChannel - 用于UDP的數(shù)據(jù)讀寫 3.TCP類 : ServerSocketChannel/SocketChannel 基于TCP的數(shù)據(jù)讀寫3.3 bio的socket 和 nio的channel代碼實(shí)現(xiàn)
bio的socket代碼實(shí)現(xiàn)邏輯
nio的channel代碼實(shí)現(xiàn)邏輯
四、NIO核心- buffer(緩沖區(qū))
4.1 buffer簡(jiǎn)介
作用 - 讀寫channel中的數(shù)據(jù)或者將數(shù)據(jù)寫到channnel中。
本質(zhì) - 一塊內(nèi)存區(qū)域。這塊內(nèi)存能讀數(shù)據(jù),寫數(shù)據(jù),被nio封裝成了一個(gè)buffer對(duì)象,提供了一系列API。
4.2 buffer屬性
1.Capacity:容量 - 表明數(shù)組可以容納多少字節(jié),如果寫入的字節(jié)數(shù)超過最大容量,那么需要清空后,才能繼續(xù)往里面寫入數(shù)據(jù)。
2.Position: 位置 - position表示當(dāng)前位置,初始化為0,當(dāng)一個(gè)byte寫入后,position會(huì)移動(dòng)到下一個(gè)可插入的數(shù)據(jù)單元。position最大可為容量減1
3.Limit:上限(寫模式下) -limit表示最多能往buffer里寫入多少數(shù)據(jù),此模式下limit等于Capacity。
4.Limit:上限(讀模式下) -limit表示最多能從buffer里讀多少數(shù)據(jù),這時(shí)limit會(huì)被設(shè)置成Position值
5.Mark:標(biāo)記 - 表示一個(gè)特定的position位置,可以通過調(diào)用buffer的reset方法恢復(fù)到這個(gè)position位置。
4.3 buffer的API
1.初始化
2.寫數(shù)據(jù)
3.寫模式切換為讀模式
4.讀取一個(gè)字節(jié)
5.設(shè)置mark標(biāo)記
6.回到標(biāo)志位
7.重置屬性
五、NIO核心- Select(選擇器)
5.1 簡(jiǎn)介
1.作用 - I/O就緒選擇
2.地位 - NIO網(wǎng)絡(luò)編程的基礎(chǔ)
3.定義 - select是java的nio中能夠檢測(cè)1到多個(gè)nio通道,并能夠知曉通道是否為諸如讀寫事件做好準(zhǔn)備的組件,通過他,一個(gè)單獨(dú)的線程就可以管理多個(gè)channel,從而管理多個(gè)鏈接。
5.2 核心API
5.3 SelectionKey簡(jiǎn)介
1.四種就緒狀態(tài)常量
connect 連接就緒
accept 接收就緒
read 讀就緒
write 寫就緒
六、NIO編程實(shí)現(xiàn)步驟
文章來源:http://www.zghlxwxcb.cn/news/detail-583926.html
七、總結(jié)
文章來源地址http://www.zghlxwxcb.cn/news/detail-583926.html
到了這里,關(guān)于33. bio和nio的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!