黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

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

系統(tǒng) 1942 0


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

?

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

?

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

紹。

?

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

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

?


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

??????????????????????????????????????????????????????????????? Mina的整體架構(gòu)圖

?

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

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

?

這里先把IoService接口中要實(shí)現(xiàn)的方法和BaseIoService中實(shí)現(xiàn)的方法列舉如下:

?

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

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

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

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

?????? 或者全部實(shí)現(xiàn)接口中的方法是不矛盾的。

?

?? 2)注意代碼的重用。在面向?qū)ο蟮木幊陶Z言中都提供了抽象類和接口,抽象類和接口最大的區(qū)別

??????? 就是抽象類提供了方法的具體實(shí)現(xiàn),供其子類來調(diào)用;而接口只是提供了對方法的聲明,其方

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

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

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

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

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


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

?

之所以在這里羅列這么些問題,目的不僅僅是為了講解Mina的原理,而是想從一個高的角度來看待的這個經(jīng)典的開源項(xiàng)目,通過對Mina的學(xué)習(xí)和理解,能夠真正的懂得什么是一個項(xiàng)目,什么是面向?qū)ο缶幊蹋举|(zhì)的東西是怎么靈活運(yùn)用Java來達(dá)到上面的兩個目的。這個才是最重要的,哪怕是你在看完本文后對Mina的理解還是有點(diǎn)模糊,但是你至少要知道在編寫一個程序的時候怎樣從面向?qū)ο蟮慕嵌壬先ニ伎家粋€問題,而不是在用著面向?qū)ο蟮恼Z言寫著結(jié)構(gòu)化的程序。這些東西都是自己做開發(fā)這么長時間的一些心得,在這里總結(jié)出來,目的主要是用于交流和學(xué)習(xí),不是在賣弄,只是想讓更多的初學(xué)者少走一些彎路,懂得學(xué)習(xí)的方法。

?

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

?

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

?

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

?

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

?

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

?

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

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

?

getListeners():獲取當(dāng)前服務(wù)的監(jiān)聽器。

?

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

?

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

?

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

?

?

?

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


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

首先,說一下BaseIoAcceptor中的三個具體實(shí)現(xiàn)類:


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

BaseIoAcceptor及其子類
與BaseIoAcceptor相對應(yīng)的就是BaseIoConnector,該類主要用于客戶端程序。其具體的子類就不再贅述,這里只給出BaseIoConnector及其子類的結(jié)構(gòu)圖。

BaseIoConnector及其子類

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


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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論