3種網(wǎng)絡(luò)編程 I/O 模型:BIO、NIO、AIO
成都創(chuàng)新互聯(lián)公司是專業(yè)的射陽網(wǎng)站建設(shè)公司,射陽接單;提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行射陽網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!- BIO:同步并阻塞(傳統(tǒng)阻塞型),一個(gè)連接一個(gè)線程,連接數(shù)目比較小且固定的架構(gòu)場(chǎng)景
- NIO:同步非阻塞,一個(gè)線程處理多個(gè)連接,連接數(shù)目多且連接比較短的架構(gòu)場(chǎng)景
- AIO:異步非阻塞,Proactor 模式,有效請(qǐng)求才啟動(dòng)線程,連接數(shù)較多且連接時(shí)間較長(zhǎng)場(chǎng)景
BIO(blocking I/O)
- 基本介紹:傳統(tǒng)的 Java IO 編程
- BIO:同步阻塞
- 簡(jiǎn)單流程
- 服務(wù)器啟動(dòng)一個(gè) ServerSocket
- 客戶端啟動(dòng)一個(gè) Socket 進(jìn)行通信,默認(rèn)每個(gè)客戶端建立一個(gè)線程進(jìn)行通訊
- 客戶端發(fā)起請(qǐng)求后先咨詢服務(wù)器是否有線程響應(yīng),沒有就等待或者被拒絕
- 有響應(yīng),客戶端線程會(huì)等待請(qǐng)求結(jié)束后,再繼續(xù)執(zhí)行
NIO(Java non-blocking IO)
- 三大核心部分:Channel、Buffer、Selector
- 每個(gè) Channel 會(huì)對(duì)應(yīng)一個(gè) Buffer
- Selector 對(duì)應(yīng)一個(gè)線程,一個(gè)線程對(duì)應(yīng)多個(gè) Channel(連接)
- Selector 切換到哪個(gè) Channel 由事件決定,Event 就是一個(gè)重要概念
- Selector 會(huì)根據(jù)不同的事件,在各個(gè)通道上切換
- Buffer 就是一個(gè)內(nèi)存塊,底層有一個(gè)數(shù)組
- 數(shù)據(jù)的讀取寫入是通過 Buffer(BIO 要么是輸入或者輸出流,不能雙向,但是NIO的 Buffer 可以讀也可以寫,需要 flip 切換)
- Channel 是雙向的,可以返回底層操作系統(tǒng)的情況,比如 Linux,底層的操作系統(tǒng)通道就是雙向的
- NIO 面向緩沖區(qū)或者面向塊
- 基本介紹
- 使用線程從某通道發(fā)送請(qǐng)求或者讀取數(shù)據(jù),僅能獲取目前可用的數(shù)據(jù),如果目前沒有數(shù)據(jù)可用,就什么都不會(huì)獲取,而不是保持線程阻塞
- 通俗理解:用一個(gè)線程處理多個(gè)操作
- HTTP2.0 使用了多路復(fù)用的技術(shù),做到同一個(gè)連接并發(fā)處理多個(gè)請(qǐng)求,比HTTP1.1大了好幾個(gè)數(shù)量級(jí)
- NIO 和 BIO
- BIO 以流處理數(shù)據(jù),NIO 以塊處理數(shù)據(jù),塊 I/O 效率比流 I/O 高很多
- BIO 阻塞,NIO 非阻塞
- BIO 基于字節(jié)流和字符流進(jìn)行操作,NIO 基于 Channel 和 Buffer 進(jìn)行操作,數(shù)據(jù)總是從通道讀取到緩沖區(qū),或者從緩沖區(qū)寫入通道中
- Selector 用于監(jiān)聽多個(gè)通道的事件(連接請(qǐng)求,數(shù)據(jù)到達(dá)),所以單個(gè)線程能監(jiān)聽多個(gè)客戶端通道
- 緩沖區(qū)(Buffer)
- 本質(zhì)上就是一個(gè)可以讀寫的內(nèi)存塊,理解成一個(gè)容器對(duì)象(含數(shù)組)
- 緩沖區(qū)對(duì)象內(nèi)置流一些機(jī)制,能夠跟蹤和記錄緩沖區(qū)的狀態(tài)變化情況
- 屬性
- Capacicty:容量,緩沖區(qū)創(chuàng)建的時(shí)候被設(shè)定并且不能改變
- Limit:當(dāng)前終點(diǎn),不能對(duì)緩沖區(qū)超過極限的位置進(jìn)行讀寫操作,且極限是可以修改的
- Position:位置,下一個(gè)要被讀或?qū)懙脑氐乃饕?,每次讀寫緩沖區(qū)數(shù)據(jù)時(shí)都會(huì)改變的值,為下次做準(zhǔn)備
- Mark:標(biāo)記
- 通道(Channel)
- NIO 通道類似于流
- 可以同時(shí)讀寫,流只能讀或者寫
- 可以實(shí)現(xiàn)異步讀寫數(shù)據(jù)
- 可以從緩沖讀數(shù)據(jù),可以寫數(shù)據(jù)到緩沖
- BIO 中的 stream 是單向的,NIO 中的 Channel 是雙向的可讀寫
- Channel 在 NIO 中時(shí)一個(gè)接口,常用 FileChannel、DatagramChannel、ServerSocketChannel、SocketChannel
- FileChannel:用于文件的讀寫
- DatagramChannel:用于 UDP 的數(shù)據(jù)讀寫
- ServerSocketChannel、SocketChannel 用于 TCP 的數(shù)據(jù)讀寫
- 選擇器(Selector)
- 基本介紹
- Selector 能夠檢測(cè)多個(gè)注冊(cè)的通道上是否有事件發(fā)生,有就獲取事件然后針對(duì)每個(gè)事件進(jìn)行相應(yīng)的處理
- 只有在連接真正有讀寫事件發(fā)生時(shí),才會(huì)進(jìn)行讀寫,減少開銷
- 避免多線程之間的上下文切換導(dǎo)致的開銷
- Selector、SelectionKey、ServerSocketChannel、SocketChannel 關(guān)系
- 客戶端連接時(shí),會(huì)通過 ServerSocketChannel 得到 SocketChannel
- Selector 開始監(jiān)聽
- 將 SocketChannel 注冊(cè)到 Selector 上,一個(gè) Selector 可以注冊(cè)多個(gè) SocketChannel
- 注冊(cè)后返回一個(gè) SelectionKey 會(huì)和該 Selector 關(guān)聯(lián)(集合)
- Selector 進(jìn)行監(jiān)聽 select 方法,返回有事件發(fā)生的通道個(gè)數(shù)
- 進(jìn)一步得到各個(gè) SelectionKey(有事件發(fā)生)
- 再通過 SelectionKey 反向獲取 SocketChannel
- 可以通過 channel() 方法得到 channel,完成業(yè)務(wù)處理
- SelectionKey
- 表示 Selector 和網(wǎng)絡(luò)通道的注冊(cè)關(guān)系
- OP_ACCEPT:有新的網(wǎng)絡(luò)連接可以 accept,值為 16
- OP_CONNECT:代表連接已經(jīng)建立,值為 8
- OP_WRITE:代表寫操作,值為 4
- OP_READ:代表讀操作,值為 1
- ServerSocketChannel
- 在服務(wù)器端監(jiān)聽新的客戶端 Socket 連接
- 相關(guān)方法
- open:得到一個(gè) ServerSocketChannel 通道
- bind:設(shè)置服務(wù)器端口號(hào)
- configureBlocking:設(shè)置阻塞或非阻塞模式
- accept:接受一個(gè)連接
- register:注冊(cè)一個(gè)選擇器并設(shè)置監(jiān)聽事件
- SocketChannel
- 網(wǎng)絡(luò) IO 通道,具體負(fù)責(zé)進(jìn)行讀寫操作,NIO 把緩沖區(qū)的數(shù)據(jù)寫入通道,或者把通道數(shù)據(jù)寫入緩沖區(qū)
- 相關(guān)方法
- open
- configureBlocking
- connect
- finnishConnect
- write
- read
- register
- close
- 存在問題
- NIO 類庫和 API 繁雜,需要熟練掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等
- 需要具備 Java 多線程編程,NIO 編程涉及 Reactor 模式,必須對(duì)多線程和網(wǎng)絡(luò)編程非常熟悉才能寫出高質(zhì)量的 NIO 程序
- 開發(fā)工作量和難度都非常大,例如:臨斷連重連、網(wǎng)絡(luò)閃斷、半包讀寫、失敗緩存、網(wǎng)絡(luò)擁塞和異常流
- NIO Bug:Epoll Bug,導(dǎo)致 Selector 空輪詢,CPU 100%
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
文章標(biāo)題:JavaIO:BIO、NIO-創(chuàng)新互聯(lián)
網(wǎng)站路徑:
http://weahome.cn/article/hhjij.html