Netty學習筆記(二)

前兩天寫了一點netty相關的知識,並寫了一個demo,可是對其原理仍是沒有深刻,今天咱們來作一次研究吧bootstrap

首先讓咱們來認識一下netty的幾個核心人物吧安全

BOOTSTRAP

Netty 應用程序經過設置 bootstrap(引導)類的開始,該類提供了一個 用於應用程序網絡層配置的容器。服務器

服務器端

Figure 9.3 ServerBootstrap.jpg
ServerChannel實現負責建立子 Channel,它表明接受鏈接網絡

客戶端

Figure 9.2 Bootstrap process.jpg

在調用 bind() 或 connect() 以後,Bootstrap 類負責建立管道給客戶或應用程序,異步

CHANNEL

底層網絡傳輸 API 必須提供給應用 I/O操做的接口,如讀,寫,鏈接,綁定等等。對於咱們來講,這層結構幾乎老是會成爲一個「socket」。 Netty 中的接口 Channel 定義了與 socket 豐富交互的操做集:bind, close, config, connect, isActive, isOpen, isWritable, read, write 等等。 Netty 提供大量的 Channel 實現來專門使用。這些包括 AbstractChannel,AbstractNioByteChannel,AbstractNioChannel,EmbeddedChannel, LocalServerChannel,NioSocketChannel 等等。socket

CHANNELHANDLER

ChannelHandler支持不少協議,而且提供用於數據處理的容器。咱們已經知道 ChannelHandler 由特定事件觸發。 ChannelHandler 可專用於幾乎全部的動做,包括將一個對象轉爲字節(或相反),執行過程當中拋出的異常處理。
經常使用的一個接口是 ChannelInboundHandler,這個類型接收到入站事件(包括接收到的數據)能夠處理應用程序邏輯。當你須要提供響應時,你也能夠從 ChannelInboundHandler 沖刷數據。一句話,業務邏輯常常存活於一個或者多個 ChannelInboundHandler。oop

CHANNELPIPELINE

ChannelPipeline 提供了一個容器給 ChannelHandler 鏈並提供了一個API 用於管理沿着鏈入站和出站事件的流動。每一個 Channel 都有本身的ChannelPipeline,當 Channel 建立時自動建立的。 ChannelHandler 是如何安裝在 ChannelPipeline? 主要是實現了ChannelHandler 的抽象 ChannelInitializer。ChannelInitializer子類 經過 ServerBootstrap 進行註冊。當它的方法 initChannel() 被調用時,這個對象將安裝自定義的 ChannelHandler 集到 pipeline。當這個操做完成時,ChannelInitializer 子類則 從 ChannelPipeline 自動刪除自身。spa

Figure 3.4 ChannelPipeline with inbound and outbound ChannelHandlers.jpg

Figure 6.3 Channel, ChannelPipeline, ChannelHandler and ChannelHandlerContext.jpg

1.Channel 綁定到 ChannelPipeline
2.ChannelPipeline 綁定到 包含 ChannelHandler 的 Channel
3.ChannelHandler
4.當添加 ChannelHandler 到 ChannelPipeline 時,ChannelHandlerContext 被建立線程

EVENTLOOP

EventLoop 用於處理 Channel 的 I/O 操做。一個單一的 EventLoop一般會處理多個 Channel 事件。一個 EventLoopGroup 能夠含有多於一個的 EventLoop 和 提供了一種迭代用於檢索清單中的下一個。netty

簡單點來講,EventLoopGroup 是一個線程池,EventLoop是其中一個線程
但netty並不只限於此
一旦 Channel 是分配給一個 EventLoop,它將使用這個 EventLoop 在它的生命週期裏和一樣的線程。你能夠,也應該,依靠這個,由於它能夠確保你不須要擔憂同步(包括線程安全、可見性和同步)在你 ChannelHandler實現。

CHANNELFUTURE

Netty 全部的 I/O 操做都是異步。由於一個操做可能沒法當即返回,咱們須要有一種方法在之後肯定它的結果。出於這個目的,Netty 提供了接口 ChannelFuture,它的 addListener 方法註冊了一個 ChannelFutureListener ,當操做完成時,能夠被通知(無論成功與否)。

相關文章
相關標籤/搜索