Java網(wǎng)絡(luò)編程(JAVA網(wǎng)絡(luò)編程面試題)
傳統(tǒng)的TCP和UDP通訊都是同步阻塞式IO(BIO),I指輸入流,O指輸出流,阻塞體現(xiàn)在通信的雙方接收和發(fā)送信息的速率不一樣,從而導(dǎo)致快的一方一直在等待慢的一方,不能進(jìn)行下一步動(dòng)作,同步體現(xiàn)在一直在等待對(duì)方響應(yīng)
NIO即同步非阻塞式IO,JDK4提出來(lái)的,主要有三大組件:Buffer(這個(gè)BIO也有,做數(shù)據(jù)緩沖,例如ReaderBuffer),Channel(這個(gè)類(lèi)似BIO的輸出輸入流,不同點(diǎn)在于,channel是全雙工的,可以雙向通信),Selector(多路選擇器,實(shí)現(xiàn)非阻塞IO的關(guān)鍵),服務(wù)端建立ServerSocketChannel后,將其綁定在Selector上,Selector對(duì)ServerSocketChannel管道上接入的客戶(hù)端連接進(jìn)行輪詢(xún)監(jiān)聽(tīng),當(dāng)發(fā)生相應(yīng)的Selectionkey事件后,進(jìn)行相應(yīng)的讀寫(xiě)操作,這種情況下,是一個(gè)服務(wù)端管道對(duì)應(yīng)多個(gè)客戶(hù)端管道,中間用一個(gè)選擇器對(duì)多個(gè)客戶(hù)端管道的進(jìn)行處理,當(dāng)哪個(gè)管道有事件發(fā)生的時(shí)候,就拿這個(gè)管道與服務(wù)端管道進(jìn)行對(duì)接通信,這樣就不用一直等著某個(gè)客戶(hù)端了,實(shí)現(xiàn)了非阻塞
AIO即異步IO,JDK7提出來(lái)的,采用回調(diào)方法進(jìn)行讀寫(xiě)操作,簡(jiǎn)單講就是,消息給你發(fā)過(guò)去就不管了,你啥時(shí)候回我,調(diào)用我給你的方法(回調(diào)方法)就行了,建立管道連接方式和BIO/NIO差不多,核心類(lèi)是Completionhandler,用于回調(diào)操作
Netty是一個(gè)非阻塞,基于異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)通信框架,簡(jiǎn)單講是NIO和AIO的組合體,利用回調(diào)函數(shù)(主要是各種handler類(lèi))實(shí)現(xiàn)了異步(這點(diǎn)像AIO),利用事件分類(lèi)做了業(yè)務(wù)驅(qū)動(dòng)處理,例如對(duì)處理類(lèi)分成Inbound和OutBound兩種類(lèi)型,通信套路跟上述通信方式大同小異,都是建立管道進(jìn)行通信