天天看點

【Netty】netty學習之nio了解

【一】五種IO模型:

(1)阻塞IO

(2)非阻塞IO(任務送出,工作線程處理,委托線程等待工作線程處理結果的同時,也可以做其他的事情)

(3)IO複用模型.(委托線程接收多個任務,将任務送出給工作線程。委托線程等待多個工作線程結果,等待到其中一個,處理其中一個具體的工作)

(4)信号驅動模型

(5)異步IO模型

【二】網絡程式設計

(1)網絡程式設計的基本模型:Client/Server模型,也就是兩個程序之間進行互相通信。其中服務端提供位置資訊(綁定的ip位址和監聽的端口号),用戶端通過連結操作向服務端監聽的位址發起連接配接請求。通過三次握手建立連結,如果建立連結成功,雙方就可以通過網絡套接字(Socket)進行通信。

【三】阻塞IO和非阻塞IO的差別

(1)IO的操作:對硬碟的讀寫、對socket的讀寫以及外設的讀寫。

(2)IO讀請求操作包括兩個 階段:

    --->檢視資料是否就緒;

    --->進行資料拷貝(核心将資料拷貝到使用者線程)。

(3)阻塞IO:當使用者線程發起一個IO請求操作(本文以讀請求操作為例),核心會去檢視要讀取的資料是 否就緒,對于阻塞IO來說,如果資料沒有就緒,則會一直在那等待,直到資料就緒

(4)非阻塞IO:當使用者線程發起一個IO請求操作(本文以讀請求操作為例),核心會去檢視要讀取的資料是 否就緒,對于非阻塞IO來說,如果資料沒有就緒,則會傳回一個标志資訊告知使用者線 程目前要讀的資料沒有就緒。當資料就緒之後,便将資料拷貝到使用者線程

(5)那麼阻塞(blocking IO)和非阻塞(non-blocking IO)的差別就在于第一個階段,如果資料沒有就緒,在檢視資料是否就緒的過程中是一直等待,還是直接傳回一個标志資訊。Java中傳統的IO都是阻塞IO,比如通過socket來讀資料,調用read()方 法之後,如果資料沒有就緒,目前線程就會一直阻塞在read方法調用那裡,直到有資料才傳回;而如果是非阻塞IO的話,當資料沒有就緒,read()方法 應該傳回一個标志資訊,告知目前線程資料沒有就緒,而不是一直在那裡等待。

【四】:BIO和NIO

BIO

===>阻塞IO通信,通常導緻通信線程被長時間阻塞。

NIO

===>IO多路複用技術

===>非阻塞IO.

【五】:NIO的幾個關鍵的類

(1)緩沖區Buffer

===>Buffer是一個對象,它包含一些要寫入或要讀出的資料。

===>在NIO的庫中,所有資料都是用緩沖區處理的。在讀取資料時候,它是直接讀到緩沖區中進行的。在寫資料時候,寫入緩沖區中。任何時候通路NIO中的資料,都是通過緩沖區進行操作。

===>緩沖區實質上是一個數組,通常它是一個位元組數組(ByteBuffer),也可以是其他種類的數組。但一個緩沖區不僅僅是一個數組,緩沖區提供了對資料結構化通路以及維護讀寫位置等資訊。

===>ByteBuffer(位元組緩沖區),CharBuffer(子符緩沖區),ShortBuffer(短整型緩沖區),IntBuffer(整型緩沖區),LongBuffer(長整型緩沖區),FloatBuffer(浮點型緩沖區),DoubleBuffer(雙精度浮點型緩沖區)

(2)通道Channel

===>Channel是一個通道,可以通過它讀取和寫入資料

===>它就像自來水管一樣,網絡資料通過Channel讀取和寫入。

===>通道與流不同之處在于通道是雙向的。流隻是在一個方向上移動(一個流必須是InputStream或者OutputStream)

===>而且通道可以用于讀,寫或同時用于讀寫。

===>Channel分為兩大類,分别是用于網絡讀寫的SelectableChannel和用于檔案操作的FileChannel

===>NIO網絡程式設計的ServerSocketChannel和SocketChannel都是SelectabelChannel的子類。

(3)多路複用器Selector

===>它是javaNio程式設計的基礎,熟練掌握Selector對于掌握NIO程式設計至關重要。

===>多路複用器提供選擇已經就緒的任務的能力。

===>簡單的來講,Selector會不斷輪詢注冊在其上的Channel。如果某個Channel上面有新的TCP連接配接接入,讀和寫事件。這個Channel就處于就緒狀态,會被Selector輪詢出來,然後通過SelectionKey可以擷取就緒Channel的集合,進行後續的I/O操作。

===>一個多路複用器Selector可以同時輪詢多個Channel,由于JDK使用epoll()代替傳統的select實作。是以它并沒有最大連接配接句柄1024/2048的限制。這也意味者隻需要一個線程負責Selector的輪詢,就可以接入成千上萬的用戶端。

【六】NIO實作服務端通信序列圖

【Netty】netty學習之nio了解

NIO簡單實作服務端代碼

【Netty】netty學習之nio了解
【Netty】netty學習之nio了解

View Code

【七】Nio用戶端連結

【Netty】netty學習之nio了解

NIO簡單實作用戶端代碼

【Netty】netty學習之nio了解
【Netty】netty學習之nio了解