今天的這一節,將從總體上對mina的源代碼進行把握,網上已經有好多關於mina源碼的閱讀筆記,但好多都是列舉了一下每一個接口或者類的方法。我卻是想從mina源碼的結構和功能上對這個框架進行剖析。源碼的閱讀通常有以下幾種方法:第一,根據問題讀源碼,這種方法可能用的最多,哪裏有問題了,而後F3一步步點進去;第二種,專門爲了讀源碼而讀,從總體到局部,總用法到設計。第三種,但是根據軟件的設計特色,根據特色逐一解讀。這幾篇文章主要將根據第三種方法進行閱讀,由於mina的各個模塊頗有條理,並且我關注的重點也主要分佈在幾個核心點上,對我來講,這樣的讀法更合理。 apache
Apache MINA is a network application framework which helps users develop high performance and high scalability network applications easily. It provides an abstract ·event-driven · asynchronous API over various transports such as TCP/IP and UDP/IP via Java NIO. 設計模式
寫過NIO的人都知道,NIO裏主要有那麼幾部分,用於內容切換的各種緩衝區,固然咱們印象最深的就是ByteBuffer;用於IO服務直接連通的通道Channel,這裏有用於文件和網絡的通道;有用於實現NIO socket Reactor模式的選擇器selector;和處理字符集的Charset。而mina就是將這幾部分有機的整合,實現了這個高性能的框架。 服務器
在看代碼以前,咱們要先了解mina到底爲咱們提供了什麼,我按照源碼的結構整理以下: 網絡
用於緩衝區的IoBuffer session |
org.apache.mina.core.buffer app |
用於提供鏈接的service 框架 |
org.apache.mina.core.service 異步 org.apache.mina.transport.* socket |
用於提供兩端狀態的session async |
org.apache.mina.core.session |
用於攔截全部IO事件和請求的filter chain和各種攔截器(在IoService和IoHandler之間) |
org.apache.mina.core.filterchain org.apache.mina.filter.* |
用於處理IO事件的handler |
org.apache.mina.handler.* |
用於實現異步IO操做的 future |
org.apache.mina.core.future |
用於實現IO輪詢的的polling |
org.apache.mina.core.polling |
用於實現代理的proxy |
org.apache.mina.proxy.* |
至此,mina-core-2.0.7中的代碼大體就能夠分紅上述這幾類了。而咱們對源碼的瀏覽也會按照這幾部分逐一進行。
在開始閱讀代碼以前,咱們再熟悉一下mina在通訊時會作的事情,這樣的事情不是徒勞的,對過程理解的越透徹對代碼的分析也會越深入,咱們不但要學習代碼裏的設計模式和組織結構,更要去理解裏面的實現邏輯。沒裝UML的工具,就拿PPT畫了:
這裏的變現沒有像以前mina通訊那篇文章裏同樣,描述具體的編碼和解碼過程,這個圖主要描述了兩端對接的過程,是一個宏觀上的通訊過程:
一、 圖中的一對應的是service執行的過程,首先確定是要創建鏈接,對於服務端是Accept,客戶端則是connect。
二、 圖中的二,指的是在每次鏈接以後就會產生一個記錄通訊信息的session,咱們看mina官方的描述:every time a client connects to the server, a new session is created, and will be kept in memory until the client is disconnected.
三、 圖中的三指的是過濾器鏈,這裏主要實現咱們對通訊的要求,好比編碼、解碼、日誌等。
四、 圖中的四是Handler,是filter chain的最後一步,經過adapter接入了session的整個生命週期。
服務器端反之亦然。
上面的圖示mina官方給出的,表述的同一個意思。在IoHandler這裏mina是這麼給出描述的: The interface is hub of all activities done at the end of the Filter Chain.
分析清楚了整個代碼的體系,後面開始,咱們就能夠針對每個部分詳細分析了。咱們會從最基本的緩衝區開始,這部分相對比較獨立,以後會根據鏈接過程進行一步步分析。後面的一篇,我會從IoBuffer開始寫起。