1. 程式人生 > >Netty原始碼分析--初始化Options,新增處理器(四)

Netty原始碼分析--初始化Options,新增處理器(四)

接上篇,我們繼續進入AbstractBootstrap類的 initAndRegister() 方法

進入init()方法

設定父級Channel的options,

進入到上節提到的NioServerSocketChannelConfig

其實就是為我們的channel.config()設定全域性屬性,當然我們也可以設定attr。

繼續看,從channel中獲取新建立的pipeline,獲取我們初始化的childOptions和childAttrs,我們這裡都是null,因為我們並未通過引導器ServerBootStrap來設定。

然後呼叫了pipeline的addLast方法,傳入了一個抽象方法的實現類,這個類就是當前的此類,ServerBootstrap, 這裡要注意

繼續程式碼跟進去,我們debug看一下

繼續跟

進入 newCtx = newContext(group, name, handler);

 

我們看,這裡childExecutor由於傳入的事件迴圈組是null,所以childExecutor(group)的返回時null, 並且 new 了一個 DefaultChannelHandlerContext 。

進入構造方法

將ServerBootstrap 賦給成員變數 handler , isInboud(handler) 和 isOutbound(handler) 是用來判斷是入站處理器還是出站處理器

確認一下,看到ServerBootstrap 繼承的這類 ChannelInitializer 繼承了 入站處理器的介面卡, 也就是  isInboud(handler) = true  , isOutbound(handler)  = false

繼續進去父類的構造方法 ,賦值成員變數, 這個時候executor 是 null, 也就是說這裡還沒有指定當前的這個channel 以後由那個執行緒來處理

總結一下就是建立了一個上下文包裹了這個ServerBootstrap

我們繼續往下看:

把剛剛建立的這個上下文 新增到 pipeline的列表中

現在就變成了這樣的層級關係 HeadContext -> ServerBootstrap -> TailContext

看到這裡大家或許會有一些疑問,為什麼把ServerBootstrap新增到連結串列中?而不是我們最開始的那個LoggingHandler呢?

其實

這裡只是新增一個抽象方法的實現類進去,並沒有真正呼叫initChannel的方法,這個要注意,這個在後面channel註冊完後會來呼叫,並且會把我們當前新增的這個ServerBootstrap從連結串列中移除掉,這個我們後面再說。

同時值得注意的是,這裡還初始化了一個ServerBootstrapAcceptor類,沒錯這個就是acceptor, 用來接收客戶端連線並且將新的客戶端註冊到多路複用器上,便於處理後面的讀寫操