1. 程式人生 > >mina框架-------NioSocketAcceptor和NioSocketConnector物件

mina框架-------NioSocketAcceptor和NioSocketConnector物件

轉載自:http://www.cnblogs.com/duanxiaojun/p/6617212.html

今天著重對mina服務端的NioSocketAcceptor 進行學習。

說這個玩意之前,先整體上看一下在mina框架中NioSocketAcceptor和NioSocketConnector 這兩個玩意的整體程式碼結構:

從上面的程式碼結構我做如下的解釋:

服務端通過建立一個NioSocketAcceptor來接受請求,客戶端通過建立NioSocketConnector來連線服務端併發送請求。

 IoService是對於伺服器端接受連線和客戶端發起連線兩類行為的一個抽象。IoServer用來執行真正的 I/O 操作,以及管理 I/O 會話。兩個子介面為IoAcceptor和IoConnector。IoAcceptor用來接受連線,與客戶端進行通訊。IoConnector用來發起連線,與服務端進行通訊。IoAcceptor和IoConnector都分別有基於TCP/IP協議協議,UDP/IP協議以及虛擬機器管道通訊的子介面。

上面是NioSocketAcceptor和NioSocketConnector的一個類的結構,現在我們從服務端先來說:先看一下服務端的程式碼繼承和介面:

在這裡我們知道我們想使用mina的時候就是先從一個NioSocketAcceptor定義開始,定義NioSocketAcceptor的時候需要繫結或者指定其對應的過濾器,IOHandler處理器,執行緒池等等。從原始碼中我們可以知道NioSocketAcceptor的方法的入口是linstener,結束的出口是dispose()。哪我們就從一個NioSocketAcceptor的定義開始。

首先看一下我們定義開始的地方跟我們上一講中實現一個mina服務端編寫是一樣的。在這裡我們重點來看我們實現了一個MinaSocketServer的介面,而這個介面中只有兩個方法

我們從listener的方法中可以看到是這樣的實現,定義一個NioSocketAcceptor,指定過濾鏈,iohandler處理器,繫結埠。我們就先從初始化的NioSocketAcceptor來說,先看NioSocketAcceptor的new操作》

我們可以看到對NioSocketAcceptor的初始化建立的時候是傳入了一個SimpleIoProcessorPool物件,而其中有NioProcessor和一個執行緒池,對這兩個的解釋我們先放到後面,先來看nioSocketAcceptor的建構函式原始碼:

在這個程式碼中我們需要注意一下哈 這裡的這個selector是用volatile來修飾的,這樣線上程每次使用的時候,都會讀取變數修改後的最的值。想想這是為什麼。或者在面試的時候人家問你在什麼地方見到過這個詞,知道了吧,這就是我們讀原始碼的好處,到時候說不上你的面試官都不知道^_^

在這裡我們只是看到的nioSocketAcceptor的實現:下面是父類的實現以及解釋:

而在子類的init實現方法中我們可以看到做了如下的操作:

也就是開啟一個選擇器,說到這裡我們想大家應該有點印象了,因為在我們之前將nio的時候我們知道在NIO中就是這個Secletor對管道進行管理的,也就是這個selector是一個類似於服務端和客戶端管道大管家的角色,在這個secletor上註冊了不同的事件,來相應。那麼在這裡我們知道是打開了這個secletor。哪可能你會問,哪我到這裡換沒有看到你的管道channel,selector等等的建立啊,好,其實我也是這麼想的,別忘了在nioSocketAcceptor這個類的父類AbstractPollingIoAcceptor的構造方法中我們又去呼叫了AbstractPollingIoAcceptor的父類的構造方法,哪這個時候我們就去看看再哪裡mina做了什麼。

。。。不好意思在剛才說AbstractPollingIoAcceptor的建構函式的時候忘了說明一點就是在AbstractPollingIoAcceptor的建構函式中對NioProcessor進行了繫結,繫結有什麼用呢,我們先看父類的建構函式中做了什麼,再來說NioProcessor的用途。原始碼加解釋:

是不是很掃興,這都已經是第三個父類了,怎麼還沒有具體的實現,別灰心我們繼續往下跟,其實這個時候我們應該去想想,mina為什麼這樣寫程式碼,為什麼要在父類的父類中取實現具體的操作,也許這也是一個設計模式或者模板,在這裡我提出這個問題來咱們都去考慮考慮人家的程式碼為什麼這樣寫.哪在這裡我們還是接著來跟原始碼吧:

好了今天對mina服務端服務建立的一個過程做了一個大致簡單的介紹,其實並不是很詳細。我們目前暫時知道nioSocketAcceptor這個類的繼承及實現介面的關心,以及知道在初始化的過程中每個類是負責幹什麼的。