欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

深入理解Apache Mina (1)---- Mina的幾個類

系統 1616 0


最近一直在看Mina的源碼,用了Mina這么長時間,說實話,現在才開始對Mina有了一些深刻的理解,關于Mina的基本知識的介紹,這里就不多說了,網上已經有很多不錯的文章都對Mina做了較深刻的剖析,現在就是想從Mina的最根本的地方來對Mina做一些深層次上的探討。

?

還是先從Mina的入口程序來說,每當要啟動一個Mina的程序(包括服務器和客戶端)時候,這里只是對服務器重點做一些講解,至于說Mina的客戶端的應用,這里只是簡單的涉及一點,不會對其做很深入的探討。但是Mina的服務器和客戶端在很大的程度上都是一樣,所以這里就“掛一漏萬”的簡單講解一下。

?

在此之前我一直想找一種“串糖葫蘆”的方式來講解一下Mina,可是一直沒有時間來看Mina的源碼,真的是無從下手,雖然網上的很多關于Mina的一些文章,講解的非常透徹了,但是可能對于初學者來說,顯得有些深奧,在這里特別的提一下洞庭散人對Mina源碼的透徹的分析,如果你對Mina已經有了一定的了解或者是正在學習Mina的源碼,建議你去看看他的博客,里面有很多東西講的是相當到位的。在這里就不在多舉例子了。寫這篇文檔主要是想對剛接觸Mina的人講解一些Mina的基本知識,由淺入深,一步一步的學習Mina思想的精髓,我接觸Mina的時間也比較長了,幾乎天天在和它打交道,每當你發現一個新奇的用法的時候,你真的會被Mina所折服,我這里不是對Mina的吹捧,記得我曾經和同事開玩笑說,“等真正的懂得了Mina,你就知道什么叫Java了”,所以,我現在想急切的把現在所知道和了解的所有關于Mina的一些東西都想在這篇文章里面寫出來,如果有寫的不到位的地方還請各位同學多多指正,下面就開始對Mina做一個完整的介

紹。

?

先說說Mina的幾個類和接口
(1) IoService
(2) BaseIoService
(3) BaseIoAcceptor
(4) IoAcceptor
(5) IoConnector

這幾個類和接口是整個服務器或客戶端程序(IoConnector)的入口程序,其中就Mina的整體上來說,IoService是所有IO通信的入口程序,下面的幾個接口和類都是繼承或者實現了IoService接口。

?


下面先給出Mina(入口程序)的整體架構圖:

??????????????????????????????????????????????????????????????? Mina的整體架構圖

?

在這里先提出幾個個問題:
(1)為什么有了一個IoService還要再有一個BaseIoService?
(2)BaseIoService和IoAcceptor(IoConnector)有什么區別?
(3)BaseIoAcceptor(BaseIoConnector)為什么不去直接實現IoService,而是又添加了

??????? IoAcceptor(IoConnector)?
???
帶著這幾個問題我們來解讀一下Mina的源碼:
首先,解答第一個問題,為什么有了一個IoService還要再有一個BaseIoService?IoService和BaseIoService最明顯的區別就是IoService是一個接口,而BaseIoService是一個抽象類。BaseIoService實現了IoService中的部分方法。

?

這里先把IoService接口中要實現的方法和BaseIoService中實現的方法列舉如下:

?

通過對IoService和BaseIoService的比較可以發現,除了getDefaultConfig()這個方法沒有在BaseIoService中實現之外,其他的方法都已經在BaseIoService實現了。這里就有一個問題,為什么BaseIoService只是實現了IoService的部分方法,而沒有全部實現IoService的方法呢?通常都知道,接口中的方法是必須要由實現類來實現的,這點是毋庸置疑的。你可以寫一個空方法,里面沒有任何的邏輯處理,但是你的實現類中卻不能沒有該方法。但是在Mina中作為實現類的BaseIoService卻沒有IoService指定的方法getDefaultConfig(),難道Mina真的有獨到之處?不是!仔細看看

BaseIoService你就會知道,BaseIoService是一個抽象類,抽象類就是用來被繼承的,它提供了一些其子類公用的一些方法,當抽象類實現一個接口時,抽象類可以有選擇性的實現其所有子類都需要的實現的一些方法,對于接口中指定法方法,抽象類可以選擇全部實現或者部分實現。在Mina中如果沒有BaseIoService這個抽象類,而是由BaseIoAcceptor和BaseIoConnector直接去實現BaseIoService接口,那么必然會導致這個兩個實現類中都要重寫相應的方法,這樣就脫離了面向對象設計的本質,沒有達到復用的目的。在BaseIoAcceptor/BaseIoConnector和BaseIoService之間添加一個BaseIoService就是為了達到代碼復用的目的。在這個問題上主要是要記住兩點:
??
?? 1)抽象類在實現接口的時候可以部分或者全部實現接口中的方法。但是當抽象類只是實?
?????? 現了接口中的部分方法的時候,抽象類的子類必須要實現抽象類中未實現的接口的方
?????? 法。在此處,IoService的getDefaultConfig()方法在BaseIoService(BaseIoAcceptor??
????? ?是BaseIoService的子類,但它也是一個抽象類,所以它也沒有實現getDefaultConfig()),

?????? getDefaultConfig() 是??? 由BaseIoAcceptor的子類們來實現的(如SocketAcceptor,這是一個

?????? 具體實現類)。所以接口的所有方法必須被具體的實現類實現和抽象類在實現接口的時候可以部分

?????? 或者全部實現接口中的方法是不矛盾的。

?

?? 2)注意代碼的重用。在面向對象的編程語言中都提供了抽象類和接口,抽象類和接口最大的區別

??????? 就是抽象類提供了方法的具體實現,供其子類來調用;而接口只是提供了對方法的聲明,其方

??????? 法的實現要由其具體實現類來做。在Java中一個子類只能有一個父類,但是卻能實現多個接口。

?????? 個人認為接口和抽象類各有特色,接口的使用比較靈活,不同的接口可以讓其子類扮演不同的角

?????? 色,側重于類的復用,在很大程度上解決了代碼復用的問題;抽象類更側重的是方法的復用,某

?????? 種意義上講,抽象類的使用對于程序來說使用起來更加輕松,但是是使用抽象類還是接口要根據

?????? 具體的情況而定。


????? 對于接口和抽象類的具體的用法請參考閆宏的《Java與模式》中相關部分的講解。

?

之所以在這里羅列這么些問題,目的不僅僅是為了講解Mina的原理,而是想從一個高的角度來看待的這個經典的開源項目,通過對Mina的學習和理解,能夠真正的懂得什么是一個項目,什么是面向對象編程,更本質的東西是怎么靈活運用Java來達到上面的兩個目的。這個才是最重要的,哪怕是你在看完本文后對Mina的理解還是有點模糊,但是你至少要知道在編寫一個程序的時候怎樣從面向對象的角度上去思考一個問題,而不是在用著面向對象的語言寫著結構化的程序。這些東西都是自己做開發這么長時間的一些心得,在這里總結出來,目的主要是用于交流和學習,不是在賣弄,只是想讓更多的初學者少走一些彎路,懂得學習的方法。

?

還是回到對Mina的剛提出的那幾個問題上來,現在,第一個問題已經解決了,為什么有了一個IoService還要再有一個BaseIoService?答案就是為了代碼的復用。

?

其次,下面開始討論第二個問題,BaseIoService和IoAcceptor(IoConnector)有什么區別?
在討論這個問題之前,還是先給出這兩個類(接口)提供的方法,如下圖:

?

在討論第一個問題的時候我們已經看過了BaseIoService的方法了,但是沒有對這些方法的功能做些梳理,現在就對這些方法做些簡單的介紹:

?

getFilterChainBuilder()和setFilterChainBuilder():這兩個方法主要是對一個服務的IoFilter的操作,關于IoFilter的詳細介紹會在后面給出,現在你可以將其理解為是一個處理業務邏輯的模塊,例如:黑名單的處理、數據的轉換、日志信息的處理等等都可以在這個IoFilter中實現,它的工作原理和Servlet中的過濾器很相似。

?

addListener()和removeListener():這兩個方法通過名字看就可以理解了,就是給當前的服務添加和刪除一個監聽器,這個監聽器主要是用于對當前連接到服務的IoSession進行管理,這個也會在后面做詳細的講解。

?

getManagerServiceAddress()和getManagerSessions():這兩個方法的功能比較相似,一個是獲取當前服務所管理的遠程地址,一個是獲取當前服務所管理的會話IoSession,IoSession對SocketAddress做了一個完整的封裝,你也

可以先將這兩個方法的功能理解為是一回事,具體的區別會在后面給出。isManaged():檢測某個SocketAddress是否處于被管理的狀態。

?

getListeners():獲取當前服務的監聽器。

?

看了上面對BaseIoService功能的介紹,現在我們可以理解BaseIoService提供的方法主要是用于對當前服務的管理。那么要管理一個服務,前提條件是這個服務必須存在,存在的前提是什么,就是要啟動一個服務,或者是連接到一個遠程主機上,這兩個任務分別是IoAcceptor和IoConnector來完成的,此處要注意的是這兩個對象都是接口,沒有具體的實現,具體的實現會由下面介紹的它們相關的子類(SocketAcceptor等)來實現。這樣IoAcceptor/IoConnector的功能我們就可以總結出來了,就是啟動和停止一個服務。

?

對于一個完整的服務來說,既要有啟動這樣的前提條件,還要有對服務的管理和對服務響應的邏輯處理,這兩個缺一不可,回到第二個問題,BaseIoService和IoAcceptor(IoConnector)有什么區別?區別就在于它們實現的功能不一樣,但都是為了一個完整的服務來打基礎的,兩者缺一都不能稱為一個完整的服務。這三個都是IoService子類(子接口),oService只是提供了一些服務應該具有多基本的方法,BaseIoService提供了IoService部分方法的具體實現,而IoAcceptor(IoConnector)是對特定服務要具備的操作的做了一些擴展,這樣一個服務完整的模型正在逐漸向我們清晰的展現出來。

?

再次,討論一下第三個問題。BaseIoAcceptor(BaseIoConnector)為什么不去直接實現IoService,而是又添加了IoAcceptor(IoConnector)?這個問題其實在上面已經有所涉及,為了達到對象復用的目的,所以Mina的設計者給出了一個BaseIoService,IoAcceptor(IoConnector)是實現一個特定服務必須要提供的一些方法。更具體一點,IoAcceptor(IoConnector)是為了一個特定的服務(服務器/客戶端)而設計的,而IoService只是提供了一個服務應該具備的一些基本的方法。所以在Mina中給出了一個針對具體服務的一個接口IoAcceptor(IoConnector),這樣BaseIoAcceptor(BaseIoConnector)就提供了一個服務所必備的一些條件。因為它即實現了IoAcceptor(IoConnector)接口又繼承了抽象類BaseIoService,這樣就實現了IoService中的所有方法,并且也添加了特定服務應該具有的方法(即IoAcceptor(IoConnector)中的方法)。以上就是第三個問題的答案。

?

?

?

Mina中提供的幾個特定的服務
從上面的討論中我們已經知道了Mina上層的類和接口的一些功能。即圖中所示的已經在上面解釋清楚了。


?在此我們可以把Mina的上層結構簡單的定義為Mina的“抽象層”,既然有了抽象層,肯定就會有其具體實現,抽象中最重要的兩個類是BaseIoAcceptor和BaseIoConnector,它們分別是用于服務器和客戶端的一個入口程序。

首先,說一下BaseIoAcceptor中的三個具體實現類:


DatagramAcceptorDelegate:數據報UDP通信的服務器入口程序。該類使用UDP協?? 議進行通信,UDP協議主要是用在視頻、遠程服務的監聽(如心跳程序)中等數據傳輸?? 要求不是很高的地方。
VmPipeAcceptor:虛擬通道(VM)通信的服務器入口程序。虛擬管道協議主要用于無線通信方面。?????????????
SocketAcceptor:TCP/IP通信的服務器入口程序。這個是比較常用的協議,該協議主要?? 數據傳輸要求較高的地方,比如實時系統、游戲服務器等。

BaseIoAcceptor及其子類
與BaseIoAcceptor相對應的就是BaseIoConnector,該類主要用于客戶端程序。其具體的子類就不再贅述,這里只給出BaseIoConnector及其子類的結構圖。

BaseIoConnector及其子類

關于SocketAcceptor、IoFilter、IoProcessor、IoHandler等會有專門的文章來討論。這里就不在對這些組件類做詳細的說明了。


深入理解Apache Mina (1)---- Mina的幾個類


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 精品久久久久久亚洲 | 亚洲在线一区二区三区 | 91青青草视频 | 亚洲国产精品网站 | 亚洲一区二区三区免费在线观看 | 九色视频自拍 | 国产婷婷色综合AV蜜臀AV | 亚洲国产综合久久精品 | 久草视频在线播放 | 人人九九精 | 午夜精品一区二区三区在线观看 | 91婷婷韩国欧美一区二区 | 精品国产免费一区二区三区 | 成人福利短视频 | 午夜精品久久久久久91 | 亚洲在线观看网站 | 久草视 | 手机国产日韩高清免费看片 | 国产精品一区二555 欧美在线免费 | 日韩在线观看你懂的 | 亚洲欧美一区二区三区久本道 | 午夜成人免费视频 | 日韩精品一区在线观看 | 亚洲国产一区二区三区四区色欲 | 亚洲欧美在线免费观看 | 成人一级黄色大片 | 精品一区二区电影 | 亚洲在线视频播放 | 高清男女性高爱潮免费 | 免费乱理伦片在线观看八戒 | 欧美精品二区三区 | 九九av| 日韩欧美在 | 欧美一级大片免费观看 | 欧美特黄aaaaaaaa大片 | 手机看片高清日韩精品 | 无遮挡又黄又刺激的视频 | 色综合亚洲色综合久久网张柏芝 | 岛国一区 | 色噜噜狠狠色综合日日 | 国产精品毛片久久久久久久 |