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