Channel按照其字面意思很是容易理解,那就是"管道"。自來水通遍千家萬戶須要架設管道,暖氣也須要架設管道,一樣,網絡通訊也須要架設管道,這個管道就是咱們的Socket
。咱們發現,自來水管道中流通的是自來水,暖氣管道中流通的是暖氣,那麼Socket
中流通的當屬咱們的字節流了。網絡
說了這麼多,那麼到底什麼是Channel呢?小編理解,Channel就是鏈接網絡Socket和具備read, write, connect, and bind
能力的組件的一條通道。多線程
一個Channel一般擁有下面幾種屬性:異步
open
狀態,是否處於鏈接connected
狀態ChannelConfig
對象相關聯,用於對該Channel
進行配置,好比接收緩衝區的大小
ChannelPipeline
對象相關聯,用於處理I/O事件events
Netty 中的 Channel
在Java NIO基礎之上封裝了更多的操做。在 Netty 中,全部的I/O操做都是異步的。這意味着咱們不能在調用I/O操做以後當即獲得I/O操做的結果,所以Netty中提供了一個ChannelFuture
,每次調用異步I/O以後會返回該對象。工具
在 Netty 中,Channel是具備繼承結構的,咱們能夠經過調用Channel的parent()
方法獲取,parent()
方法的返回取決於該Channel是怎麼建立出來的。好比一個SocketChannel
由一個ServerSocketChannel
接收,所以當調用SocketChannel
的parent()
方法時將返回ServerSocketChannel
oop
每次當處理完Channel操做時,咱們應該顯式調用其close()
和close(ChannelPromise)
對資源進行釋放,這將確保全部資源都以正確的方式釋放掉~操作系統
總的來講,不一樣的協議,不一樣用途會對應不一樣類型的Channel
。下面貼出Channel
的接口繼承圖:線程
UnixChannel
:此類Channel只暴露一些在Unix類操做系統上面纔會有的操做DatagramChannel
:一個處理UDP/IP
協議的 ChannelDuplexChannel
:一個擁有兩個端點並能在每一個端點獨立關閉的全雙工ChannelHttp2StreamChannel
:支持HTTP/2
協議的 ChannelSctpChannel
:一個處理SCTP/IP
協議的ChannelServerChannel
:一個接收新鏈接而後建立子Channel的Channel組件,ServerSocketChannel
就是一個很好的例子,ServerSocketChannel
接受鏈接,而後建立出SocketChannel
一個EventLoop
是一條單純的線程,用於處理註冊在其上面的全部I/O事件,也就是說,Channel是須要註冊到EventLoop上面去的,並且一個EventLoop
一般會有多個Channel
註冊,而EventLoopGroup
則是EventLoop
的集合。3d
EventLoop
等事件線程組件繼承圖小編貼出一張簡單的繼承圖,以下所示:指針
從圖中其實能夠發現,Netty中線程模型基本上就是從一個叫EventExecutorGroup
,EventExecutorGroup
繼承了JDK中的ScheduledExecutorService
接口,所以在Netty中咱們能夠利用它作一些定時任務之類的配置。code
EventExecutorGroup
:負責經過其next()
方法來建立一系列的EventExecutor
,除此以外,也負責管理其建立的EventExecutor
生命週期並提供全局關閉方法。EventLoopGroup
是一個特殊的EventExecutorGroup
,主要用於註冊Channel
以便後續在事件循環中使用EventExecutor
是一個特殊的EventExecutorGroup
,它提供一些便捷的方法用來判斷一個線程是否在一個EnentLoop
中執行MultithreadEventExecutorGroup
顧名思義,就是容許任務在多線程中去執行Bootstrap
家族其實Netty中的Bootstrap
啓動類家族不是很龐大,至關於工具類吧!Bootstrap
和ServerBootstrap
屬於上面第二章節說到的ServerChannel
範疇,總共有3個大類,類圖以下:
Bootstrap
:用於爲客戶端打開一條通道Channel
,一般bind()
方法用於建立一個基於UDP的無狀態的連接,對於一般的TCP連接,咱們則使用其connect()
方法建立ServerBootStrap
:用於在服務端中打開一個ServerChannel
ChannelHandler
ChannelHandler
能夠用來處理I/O事件或者用於接收I/O操做,並將指針指向ChannelPipeline
中的下一個Handler
。其中ChannelPipeline
爲ChannelHandler
提供了一個容器。
ChannelInboundHandler
用於爲狀態(open close connect
)的更改設置相應的回調操做,簡而言之,ChannelInboundHandler
攔截和處理入站事件,ChannelOutboundHandler
攔截和處理出站事件.