從類庫的視角以及框架的視角來探討Netty、。
3.1 Netty 網絡的抽象 Channel,EventLoop,ChannelFuture
- Channel — Socket
- EventLoop – 控制流,多線程處理,併發。
- ChannelFuture – 異步通知
3.1.1 Channel接口
- EmbeddedChannel
- LocalServerChannel
- NioDatagramChannel
- NioSctpChannel
- NioSocketChannel
3.1.2 EventLoop 用於處理連接的是生命週期中所發生的事件。
- 一個EventLoopGroup包含一個或者多個EventLoop;
- 一個EventLoop在它的生命週期內,只和一個Thread綁定
- 所有由EventLoop處理的IO事件將在它專有的Thread上被處理。
- 一個Channel在它的聲明週期內只註冊於一個EventLoop
- 一個EventLoop可能被分配一個或者多個Channel
3.1.3 ChannelFuture接口
ChannelFuture接口的addListener()方法註冊了一個ChannelFutureListener,便於在某個操作完成時的時候,得到通知。
3.2 ChannelHandler 和 ChannelPipeline
3.2.1 ChannelHandler接口
充當了所有入站和出站數據的應用程序邏輯的容器。
ChannelHandler可以專門用於幾乎任何類型的動作。例如將數據從一種格式轉換爲另外一種格式,或者處理轉換過程中拋出的異常。
ChannelInboundHandler接收入站事件和數據,用於業務邏輯處理。程序的業務邏輯通常駐留在一個或者多個。
3.2.2 ChannelPipeline接口
ChannelPipeline提供了ChannelHandler鏈的容器,並定義了用於在該鏈上的傳播入站和出站事件流的API。當channel被創建的時候,他會被自動地分配到它專屬的ChannelPipeline。
過程如下:
- 一個ChannelInitializer的實現被註冊到了ServerBootStrap中。
- 當ChannelInitializer.initChannel()方法被盜用的時候,ChannelInitializer將在ChannelPiple中安裝一組自定義的ChannelHandler
- ChannelInitializer將它自己從ChannelPipeline中移除。
ChannelHandler是處理往來ChannelPiple事件的任務和代碼的通用容器。
ChannelHandler的工作是讓事件流經ChannelPipeline。是在應用程序的初始或者被引導階段被安裝的。執行的順序由被添加的順訊所決定。ChannelPipeline是這些ChannelHandler的編排順序。
######## 出站和入站
從客戶端的角度去看,如果事件的運動方向是客戶端到服務器端,那麼我們稱這些事件是出站。反之就是入站的。
3.2.4 編碼器和解碼器
通過netty發送接收消息,就會發生數據轉換,入站消息會被解碼。字節轉換爲另外一種格式。出站的話,則相反。。
3.2.5 抽象類 SimpleChannelInboundHandler
最常見的情況是,應用程序會利用一個ChannelHandler來接收解碼消息,並對該數據應用業務邏輯.要創建這樣一個ChannelHandler,只需要擴展SimpleChannelInboundHandler,T是要處理的消息的java類型。在這個eChannelHandler中,需要重寫基類的防範,並且獲取一個到ChannelhandlerContext的引用。這個應用將作爲輸入參數傳遞給ChannelHandler的所有方法。
3.2 引導
Netty的引導類,爲應用程序的網絡層配置提供了容器,這涉及將一個進程綁定到某一個指定的端口,或者將一個進程連接到另一個運行在某個指定主機的指定端口上的進程。
服務器和客戶端實際上表示不同的網絡行爲,是監聽傳入的連接還是建立到一個或者多個進程的連接。
兩種類型的引導,用於客戶端(BootStrap),另一種(ServerBootStrap)用於服務器。
類別 | bootstrap | ServerBootStrap |
---|---|---|
網絡編程中的作用 | 連接到遠程主機和端口 | 綁定到一個本地端口 |
EventLoopGroup的數目 | 1 | 2 |
服務器端需要兩組不同寧的Channel,第一組將包含一個ServerChannel,代表服務器吱聲的已綁定到某個本地端口正在監聽的套接字。第二組將包含所有已創建的用來處理傳入客戶端連接的Channel。如下圖
最後
如果你覺得寫的還不錯,就關注下公衆號唄,關注後,有點小禮物回贈給你。
你可以獲得5000+電子書,java,springCloud,adroid,python等各種視頻教程,IT類經典書籍,各種軟件的安裝及破解教程。
希望一塊學習,一塊進步!