Android端服務(wù)器推送技術(shù)原理分析及XMPP的使用
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
xmpp協(xié)議起源于著名的Linux即時(shí)通訊服務(wù)服務(wù)器jabber,有時(shí)候我們會(huì)把xmpp協(xié)議也叫jabber協(xié)議,其實(shí)這是不規(guī)范的,xmpp是個(gè)協(xié)議,而jabber是個(gè)服務(wù)器,因?yàn)閖abber開(kāi)源,設(shè)計(jì)精良,安全,穩(wěn)定,跨語(yǔ)言,跨平臺(tái),封裝開(kāi)發(fā)簡(jiǎn)便,越來(lái)越多人開(kāi)始使用它,并且逐步完善,不久它便形成了一個(gè)強(qiáng)大的標(biāo)準(zhǔn)化體系,Google GTalk、Pidgin、PSI、Spark、Pandion、MSN、Yahoo、ICQ..諸如此類(lèi)一些軟件在這個(gè)強(qiáng)大的標(biāo)準(zhǔn)體系下實(shí)現(xiàn)了互聯(lián).那么XMPP到底是什么意思,用通俗的話講它和基于xml格式的一些協(xié)議原理差不多,只不過(guò)是個(gè)針對(duì)服務(wù)器的軟件協(xié)議罷了。 那么在java領(lǐng)域是否存在一個(gè)類(lèi)似jabber那么強(qiáng)大開(kāi)源穩(wěn)定的也完美支持xmpp協(xié)議的服務(wù)器呢?答案有的,那便是openfire,openfire是純java開(kāi)發(fā)的基于XMPP的協(xié)議,目前最終版本鎖定在了2011年openfire 3.7,它一共有l(wèi)inux windows mac 三個(gè)版本,安裝也非常簡(jiǎn)單,openfire這個(gè)服務(wù)器是個(gè)開(kāi)放式的平臺(tái),它內(nèi)部集成的服務(wù)包括即時(shí)通訊服務(wù),會(huì)議室服務(wù),用戶安全驗(yàn)證和管理服務(wù),搜索服務(wù),組織機(jī)構(gòu)服務(wù),會(huì)話服務(wù),這幾大服務(wù)都有相應(yīng)的管理類(lèi)和對(duì)外接口,它的二次開(kāi)發(fā)和擴(kuò)展都是在插件基礎(chǔ)上直接嫁接進(jìn)去的,早期有很多第三方為他做了插件,有語(yǔ)音服務(wù),red5視頻服務(wù),郵件服務(wù)等等,語(yǔ)音和視頻在openfire上一直是個(gè)雞肋,沒(méi)有非常好的解決方案,而做這些插件的大部分都停止更新,大家如果選用openfire做視頻和語(yǔ)音還要慎重!拋開(kāi)這些插件,openfire在IM及時(shí)通訊上還是相當(dāng)強(qiáng)大穩(wěn)定的,不少公司拿它來(lái)做二次開(kāi)發(fā)!但即便如此openfire的二次開(kāi)發(fā)成本還是比較高昂的,筆者曾經(jīng)成功費(fèi)了九牛二虎之力將源碼環(huán)境搭建起來(lái),并成功將它與我們JAVAEE 經(jīng)典架構(gòu)SSH成功組裝,用openfire的桌面客戶端spark軟件和android開(kāi)源xmpp客戶端Beam軟件,web端聊天軟件Claros Chat享受了一把在自己服務(wù)器上“隨時(shí)隨地聊天”,不過(guò)這些都是實(shí)驗(yàn)階段,距離成熟可用還很遠(yuǎn)!研究技術(shù)可以這么勾兌嘗試,真的給人用可不能這么隨意,我們還是要挖掘真正對(duì)我們有用的價(jià)值! openfire過(guò)于龐大繁復(fù),許多對(duì)我們來(lái)說(shuō)都是沒(méi)什么用的,甚至要砍掉改造,能不能有精簡(jiǎn)的xmpp服務(wù)器呢?答案是有的,androidpn,筆者認(rèn)真比對(duì)過(guò)openfire和androidpn的源碼,最后驚奇的發(fā)現(xiàn),原來(lái)它就是從openfire里面庖丁解牛出來(lái)的一部分,做這件事的人非常的了不起,為我們省了很大力氣,在此感謝他的開(kāi)源和共享精神,那么androidpn分離出來(lái)的是消息推送服務(wù),簡(jiǎn)言之就是從服務(wù)端向android客戶端推送消息的服務(wù),因?yàn)閛penfire的源碼架構(gòu)是在jetty基礎(chǔ)上建立的,它的啟動(dòng)和部署方式和我們傳統(tǒng)的服務(wù)器tomcat和weblogic等有點(diǎn)區(qū)別,所以androidpn也有jetty的影子,在和我們傳統(tǒng)架構(gòu)組合的時(shí)候還要再把它和jetty拆開(kāi), androidpn的搭建和使用網(wǎng)上的教程很多,大家可以發(fā)現(xiàn)大部分千篇一律,出現(xiàn)一個(gè)OK界面就沒(méi)了,堂而皇之的寫(xiě)上原創(chuàng),有的只是改了下hello world,如此糊弄,實(shí)在難為所用! androidpn消息推送采用的是apache的mina框架做的,服務(wù)端和客戶端兩邊都有監(jiān)聽(tīng),也就是我們所說(shuō)的socket編程,有人說(shuō)socket編程有什么難的,就那么回事,其實(shí)不然,我們平時(shí)寫(xiě)的socket聊天都只是在局域網(wǎng)的,但是要穿透路由和防火墻,讓信息安全及時(shí)的傳送到另一個(gè)網(wǎng)關(guān)的局域網(wǎng)電腦中,就不是一件簡(jiǎn)單的活了,其中涉及到在nat上打洞,還有線程,斷網(wǎng)重連,安全加密等等,那么androidpn配合mina相當(dāng)于把這些活都干了,那么我們要的干活就相對(duì)比較精細(xì)了,第一學(xué)習(xí)mina的安裝配置的規(guī)則,第二學(xué)習(xí)xmpp協(xié)議組裝和解析的規(guī)則,第三學(xué)習(xí)androidpn推和收消息的核心代碼,如此三點(diǎn)我們便能靈活駕馭住androidpn出現(xiàn)再大的問(wèn)題自己也能動(dòng)手去調(diào)了。在和spring整合的時(shí)候大家要注意不要讓mina服務(wù)啟動(dòng)2次,筆者整合時(shí)候無(wú)意發(fā)現(xiàn)在linux64位系統(tǒng),weblogic上啟動(dòng)時(shí)候總是報(bào)5222已經(jīng)被占用,反復(fù)查看代碼發(fā)現(xiàn)mina在隨web容器啟動(dòng)過(guò)一次5222端口后,xmppserver類(lèi)中的start方法中ClassPathXmlApplicationContext類(lèi)又加載了一次spring配置,導(dǎo)致端口被重復(fù)開(kāi)啟兩次,后來(lái)將spring配置重新修了下,保證配置了mina的xml只被加載一次,在相同加載模式下spring的bean單例確實(shí)不會(huì)重復(fù)創(chuàng)建,但是ClassPathXmlApplicationContext加載模式必定會(huì)導(dǎo)致mina端口實(shí)例連同所有實(shí)例重新被加載,畢竟不在一個(gè)內(nèi)存中管理,統(tǒng)一管理即可解決問(wèn)題!網(wǎng)上現(xiàn)在也有不少androidpn版本,五花八門(mén)什么都有,里面到底有沒(méi)問(wèn)題,改了什么沒(méi)改什么都不知道,基本上已經(jīng)追溯不到原創(chuàng)到底是誰(shuí)了,索性就只能從國(guó)外的一個(gè)網(wǎng)站上下了一個(gè)比較可靠的版本自己動(dòng)手去量身改造,終于出了一個(gè)比較穩(wěn)定版本。而且筆者把離線消息也做了進(jìn)去,用戶只要沒(méi)收到提醒,當(dāng)他恢復(fù)連接時(shí)離線消息就會(huì)被推送過(guò)來(lái)。 對(duì)于消息提醒來(lái)說(shuō),它僅僅是個(gè)notification,許多人非要把業(yè)務(wù)數(shù)據(jù)也做進(jìn)去,更有夸張好幾兆的xml數(shù)據(jù)就這么硬塞提醒過(guò)去,這種做法本身就背離了設(shè)計(jì)的初衷,非要把跑車(chē)當(dāng)牛車(chē)使能不出問(wèn)題嗎?其實(shí)業(yè)務(wù)數(shù)據(jù)還是用http拉比較好,xmpp及時(shí)的前提是用資源消耗作為代價(jià)的,我們能適度就適度用,用好用穩(wěn)就行!如果這樣就結(jié)束了還不算太華麗,筆者教大家如何將自己家里的局域網(wǎng)電腦免費(fèi)發(fā)布到外網(wǎng)作為服務(wù)器,或者你有了答案,申請(qǐng)個(gè)花生殼賬戶就可以送一個(gè)免費(fèi)的域名,將花生殼域名客戶端在你的客戶端啟動(dòng)起來(lái),然后打開(kāi)你的路由管理,在轉(zhuǎn)發(fā)規(guī)則中->虛擬服務(wù)器->添加新條目,服務(wù)器端口號(hào)填寫(xiě)5222 ip填寫(xiě)你的內(nèi)網(wǎng)地址,再添加一個(gè)條目,服務(wù)器端口填寫(xiě)你的中間件端口,我的是8080,ip填寫(xiě)你的內(nèi)網(wǎng)地址,最后重啟路由,好了現(xiàn)在把你的花生殼域名輸入到瀏覽器 xxx.xicp.net:8080/xxx 就可以隨時(shí)隨地在外網(wǎng)使用消息推服務(wù)了,最后將你的手機(jī)端配置改成花生殼域名xxx.xicp.net,就可以收到消息。 搭建步驟: 1.android端找到res/raw/androidpn.properties文件修改服務(wù)器ip地址,不要寫(xiě)localhost,寫(xiě)絕對(duì)ip地址; 2.服務(wù)端找到resources/jdbc.properties 在mysql中新建一個(gè)數(shù)據(jù)庫(kù)apn,并將連接指向該庫(kù),設(shè)置用戶名和密碼,庫(kù)表會(huì)隨服務(wù)啟動(dòng)的時(shí)候自動(dòng)創(chuàng)建; 3.先啟動(dòng)服務(wù),再打開(kāi)android客戶端,點(diǎn)擊連接即可。 該文章在 2013/2/25 23:25:34 編輯過(guò) |
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)... |