天天看點

netty4.0.x源碼分析—bootstrap

Bootstrap的意思就是引導,輔助的意思,在編寫服務端或用戶端程式時,我們都需要先new一個bootstrap,然後基于這個bootstrap調用函數,添加eventloop和handler,可見對bootstrap進行分析還是有必要的。

bootstrap的結構比較簡單,涉及的類和接口很少,如下圖所示,其中Bootstrap則是用戶端程式用的引導類,ServerBootstrap是服務端程式用的引導類。

netty4.0.x源碼分析—bootstrap

這部分,專門對serverbootstrap進行分析,bootstrap過程大同小異就不作詳細的分析了。下面是我們編寫服務端代碼的一般化過程,整個分析過程将基于下面這段代碼中用到的函數進行。

先看關鍵代碼(注意這裡面的部分函數是在AbstractBootstrap中定義的)

屬性值ChildGroup,ChildHandler,是用來處理accpt的Channel的。group函數其實就是将parentGroup和ChildGroup進行指派,其中parentGroup用于處理accept事件,ChildGroup用于處理accpt的Channel的IO事件。

Channel函數比較簡單,其實就是通過newInstance函數,生成一個具體的Channel對象,例如服務端的NioServerSocketChannel。

上面的函數即給serverbootstrap的childHandler指派。

上面的函數是指定accpt的channel的屬性,channel有很多屬性,比如SO_TIMEOUT時間,Buf長度等等。

Bind函數層層調用過來之後,最後就調用Channel的bind函數了,下面再看channel的bind函數是如何處理的。定義在AbstractChannel中:

channel的bind函數,最終就是調用pipeline的bind,而pipeline的bind實際上就是調用contexthandler的bind,之個之前分析write和flush的時候說過了。是以這裡直接看contexthandler的bind函數。下面是定義:

最終調用Handler的bind函數,還記得之前說的outbound類型的事件嗎,這類事件提供了預設的實作方法,HeadHandler的bind函數,下面是它的定義:

我們又看到了unsafe這個苦力了,最終的操作還是得由它來完成啊,趕緊去看看這個bind函數吧,

上面的代碼最終調用了Channel的doBind函數,這裡我們的Channel是NioServerSocketChannel,是以最終就是調用它的bind函數了,代碼如下

其實它最終也是調用了JDK的Channel的socket bind函數。

看到這裡,你是否會覺得有點怪異,為什麼沒有注冊accpt事件啊,一般的我們的server socket都是要注冊accpt事件到selector,用于監聽連接配接。如果你發現了這個問題,說明你是了解socket的程式設計的,^_^。實際上是前面在分析bind的時候我們漏掉了一個重要的函數,initAndRegister,下面再來看看它的定義:

在這裡,我們看到了我們之前介紹event時說的register函數,它就是用于将Channel注冊到eventloop中去的。eventloop經過層層調用,最終調用了SingleThreadEventLoop類中的register函數,下面是它的定義:

還是逃離不了unsafe對象的調用,前面說了那麼多的unsafe,這個函數猜都可以猜測出執行過程了,這裡就不細細的列舉代碼了。

還有一個init函數,這裡需要說明一下,代碼如下:

它就是用來處理channel 的pipeline,并添加一個ServerBootstrapAcceptor的handler,繼續看看這個handler的定義,我們就會明白它的意圖。

上面就是這個handler的全部代碼,它重寫了ChannelRead函數,它的目的其實是想将server端accept的channel注冊到ChildGroup的eventloop中,這樣就可以了解,服務端代碼workerGroup這個eventloop的作用了,它終于在這裡展現出了它的作用了。

這篇文章主要是分析了serverbootstrap的全過程,通過對這個的分析,我們清晰的看到了平時編寫socket服務端代碼時對bind,register事件,以及accept channel等的處理。

<a href="http://blog.csdn.net/pingnanlee/article/details/11973769">http://blog.csdn.net/pingnanlee/article/details/11973769</a>

本文轉自茄子_2008部落格園部落格,原文連結:http://www.cnblogs.com/xd502djj/p/6095287.html,如需轉載請自行聯系原作者。