使用他人注冊商標(biāo)做網(wǎng)站湖南網(wǎng)站托管
? ?Netty是一個提供異步事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用框架,用以快速開發(fā)高性能、高可靠的網(wǎng)絡(luò)服務(wù)器和客戶端程序。Netty簡化了網(wǎng)絡(luò)程序的開發(fā),是很多框架和公司都在使用的技術(shù)。
Netty并非橫空出世,它是在BIO,NIO,AIO演變中的產(chǎn)物,是一種NIO框架。
一、BIO的理解
? ? ? 網(wǎng)絡(luò)編程的基本模型是Client/Server模型,也就是兩個進(jìn)程之間進(jìn)行相互通信,其中服務(wù)端提供位置信息(綁定的IP地址和監(jiān)聽端口),客戶端通過連接操作向服務(wù)端監(jiān)聽的
地址發(fā)送連接請求,通過三次握手建立連接,如果連接成功,雙方就可以通過網(wǎng)絡(luò)套接字(Socket)進(jìn)行通信。在基于同步堵塞模式開發(fā)中,ServerSocket負(fù)責(zé)綁定Ip地址,啟動監(jiān)
聽端口。Socket負(fù)責(zé)發(fā)起連接操作。連接成功之后,雙方通過輸入和輸出流進(jìn)行同步堵塞式通信。
BIO流程圖
BIO?全稱Block-IO 是一種阻塞同步的通信模式。我們常說的StockIO一般指的是BIO。是一個比較傳統(tǒng)的通信方式,模式簡單,使用方便。但并發(fā)處理能力低,通信耗時,依賴網(wǎng)速。
BIO 設(shè)計原理:
? ? ? ?服務(wù)器通過一個Acceptor線程負(fù)責(zé)監(jiān)聽客戶端請求和為每個客戶端創(chuàng)建一個新的線程進(jìn)行鏈路處理。典型的一請求一應(yīng)答模式。若客戶端數(shù)量增多,頻繁地創(chuàng)建和銷毀線程會
給服務(wù)器打開很大的壓力。后改良為用線程池的方式代替新增線程,被稱為偽異步IO。服務(wù)器提供IP地址和監(jiān)聽的端口,客戶端通過TCP的三次握手與服務(wù)器連接,連接成功后,雙
放才能通過套接字(Stock)通信。
小結(jié):BIO模型中通過Socket和ServerSocket完成套接字通道的實現(xiàn)。阻塞,同步,建立連接耗時。
二、NIO的理解
? ? ? ?與Socket類和ServerSocket類相對應(yīng),NIO也提供了SocketChannel和ServerSocketChannel兩種不同的套接字通道實現(xiàn)。這兩種新增的通道都支持阻塞和非阻塞兩種模
式。阻塞模式使用非常簡單,但是性能和可靠性都不好,非阻塞模式則正好相反。幵發(fā)人員一般可以根據(jù)自己的需要來選擇合適的模式,一般來說,低負(fù)載、低并發(fā)的應(yīng)用程序可
以選擇同步阻塞I/O以降低編程父雜度,但是對于高負(fù)載、高并發(fā)的網(wǎng)絡(luò)絡(luò)應(yīng)用,需要使用NIO的非堵塞模式迸行幵發(fā)。
NIO 全稱New IO,也叫Non-Block IO 是一種非阻塞同步的通信模式。
NIO流程圖
NIO 設(shè)計原理
? ? ?NIO 相對于BIO來說一大進(jìn)步??蛻舳撕头?wù)器之間通過Channel通信。NIO可以在Channel進(jìn)行讀寫操作。這些Channel都會被注冊在Selector多路復(fù)用器上。Selector通過
一個線程不停的輪詢這些Channel。找出已經(jīng)準(zhǔn)備就緒的Channel執(zhí)行IO操作。NIO 通過一個線程輪詢,實現(xiàn)千萬個客戶端的請求,這就是非阻塞NIO的特點。
NIO幾個新概念
1)緩沖區(qū)Buffer
? ? ? 它是NIO與BIO的一個重要區(qū)別。BIO是將數(shù)據(jù)直接寫入或讀取到Stream對象中。而NIO的數(shù)據(jù)操作都是在緩沖區(qū)中進(jìn)行的。緩沖區(qū)實際上是一個數(shù)組。Buffer最常見的類型
是ByteBuffer,另外還有CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer。
2)通道Channel
? ? ? ?和流不同,通道是雙向的。NIO可以通過Channel進(jìn)行數(shù)據(jù)的讀,寫和同時讀寫操作。通道與流之間不同之處是通道是雙向的,流只能一個方向移動(一個流必須是
InputStream或者OutputStream的子類)。 通道分為兩大類:一類是網(wǎng)絡(luò)讀寫(SelectableChannel),一類是用于文件操作(FileChannel),我們使用的SocketChannel
和ServerSocketChannel都是SelectableChannel的子類。
3)多路復(fù)用器Selector
? ? ?NIO編程的基礎(chǔ)。多路復(fù)用器提供選擇已經(jīng)就緒的任務(wù)的能力。就是Selector會不斷地輪詢注冊在其上的通道(Channel),如果某個通道處于就緒狀態(tài),會被Selector輪詢出
來,然后通過SelectionKey可以取得就緒的Channel集合,從而進(jìn)行后續(xù)的IO操作。服務(wù)器端只要提供一個線程負(fù)責(zé)Selector的輪詢,就可以接入成千上萬個客戶端,這就是
JDK NIO庫的巨大進(jìn)步。
三、AIO理解
? ? ? 異步無非是通知系統(tǒng)做一件事情。然后忘掉它,自己做其他事情去了。很多時候系統(tǒng)做完某一件事情后需要一些后續(xù)的操作。
AIO 也叫NIO2.0 是一種非阻塞異步的通信模式。在NIO的基礎(chǔ)上引入了新的異步通道的概念,并提供了異步文件通道和異步套接字通道的實現(xiàn)。
AIO流程圖
? ? ? AIO 并沒有采用NIO的多路復(fù)用器,而是使用異步通道的概念。其read,write方法的返回類型都是Future對象。而Future模型是異步的,其核心思想是:去主函數(shù)等待時間。
AIO模型中通過AsynchronousSocketChannel和AsynchronousServerSocketChannel完成套接字通道的實現(xiàn)。非阻塞,異步。
四、總結(jié)
1 IO,NIO,AIO區(qū)別
? ? IO 阻塞同步通信模式,客戶端和服務(wù)器連接需要三次握手,使用簡單,但吞吐量小。
? ? NIO 非阻塞同步通信模式,客戶端與服務(wù)器通過Channel連接,采用多路復(fù)用器輪詢注冊的Channel。提高吞吐量和可靠性。
? ? AIO 非阻塞異步通信模式,NIO的升級版,采用異步通道實現(xiàn)異步通信,其read和write方法均是異步方法。
2 Stock通信的偽代碼實現(xiàn)流程
? ? ? 服務(wù)器綁定端口:server = new ServerSocket(PORT)
? ? ? 服務(wù)器阻塞監(jiān)聽:socket = server.accept()
? ? ? 服務(wù)器開啟線程:new Thread(Handle handle)
? ? ? 服務(wù)器讀寫數(shù)據(jù):BufferedReader PrintWriter
? ? ?客戶端綁定IP和PORT:new Socket(IP_ADDRESS, PORT)
? ? ?客戶端傳輸接收數(shù)據(jù):BufferedReader PrintWriter
3 什么是同步阻塞BIO,同步非阻塞NIO,異步非阻塞AIO
? ? ?同步阻塞IO?: 用戶進(jìn)程發(fā)起一個IO操作以后,必須等待IO操作的真正完成后,才能繼續(xù)運行。
? ? ?同步非阻塞IO: 用戶進(jìn)程發(fā)起一個IO操作以后,可做其它事情,但用戶進(jìn)程需要經(jīng)常詢問IO操作是否完成,這樣造成不必要的CPU資源浪費。
? ? ?異步非阻塞IO: 用戶進(jìn)程發(fā)起一個IO操作然后,立即返回,等IO操作真正的完成以后,應(yīng)用程序會得到IO操作完成的通知。類比Future模式。
4、小結(jié)
? ? ?1)BIO模型中通過Socket和ServerSocket完成套接字通道實現(xiàn)。阻塞,同步,連接耗時。
? ? 2) NIO模型中通過SocketChannel和ServerSocketChannel完成套接字通道實現(xiàn)。非阻塞/阻塞,同步,避免TCP建立連接使用三次握手帶來的開銷。
? ? 3) AIO模型中通過AsynchronousSocketChannel和AsynchronousServerSocketChannel完成套接字通道實現(xiàn)。非阻塞,異步。
再附上netty權(quán)威指南書中一張圖、