編輯:關於Android編程
xmpp協議起源於著名的Linux即時通訊服務服務器jabber,有時候我們會把xmpp協議也叫jabber協議,其實這是不規范的,xmpp是個協議,而jabber是個服務器,因為jabber開源,設計精良,安全,穩定,跨語言,跨平台,封裝開發簡便,越來越多人開始使用它,並且逐步完善,不久它便形成了一個強大的標准化體系,Google GTalk、Pidgin、PSI、Spark、Pandion、MSN、Yahoo、ICQ..諸如此類一些軟件在這個強大的標准體系下實現了互聯.那麼XMPP到底是什麼意思,用通俗的話講它和基於xml格式的一些協議原理差不多,只不過是個針對服務器的軟件協議罷了。
那麼在java領域是否存在一個類似jabber那麼強大開源穩定的也完美支持xmpp協議的服務器呢?答案有的,那便是openfire,openfire是純java開發的基於XMPP的協議,目前最終版本鎖定在了2011年openfire 3.7,它一共有linux windows mac 三個版本,安裝也非常簡單,openfire這個服務器是個開放式的平台,它內部集成的服務包括即時通訊服務,會議室服務,用戶安全驗證和管理服務,搜索服務,組織機構服務,會話服務,這幾大服務都有相應的管理類和對外接口,它的二次開發和擴展都是在插件基礎上直接嫁接進去的,早期有很多第三方為他做了插件,有語音服務,red5視頻服務,郵件服務等等,語音和視頻在openfire上一直是個雞肋,沒有非常好的解決方案,而做這些插件的大部分都停止更新,大家如果選用openfire做視頻和語音還要慎重!拋開這些插件,openfire在IM及時通訊上還是相當強大穩定的,不少公司拿它來做二次開發!但即便如此openfire的二次開發成本還是比較高昂的,筆者曾經成功費了九牛二虎之力將源碼環境搭建起來,並成功將它與我們JAVAEE 經典架構SSH成功組裝,用openfire的桌面客戶端spark軟件和android開源xmpp客戶端Beam軟件,web端聊天軟件Claros Chat享受了一把在自己服務器上“隨時隨地聊天”,不過這些都是實驗階段,距離成熟可用還很遠!研究技術可以這麼勾兌嘗試,真的給人用可不能這麼隨意,我們還是要挖掘真正對我們有用的價值!
openfire過於龐大繁復,許多對我們來說都是沒什麼用的,甚至要砍掉改造,能不能有精簡的xmpp服務器呢?答案是有的,androidpn,筆者認真比對過openfire和androidpn的源碼,最後驚奇的發現,原來它就是從openfire裡面庖丁解牛出來的一部分,做這件事的人非常的了不起,為我們省了很大力氣,在此感謝他的開源和共享精神,那麼androidpn分離出來的是消息推送服務,簡言之就是從服務端向android客戶端推送消息的服務,因為openfire的源碼架構是在jetty基礎上建立的,它的啟動和部署方式和我們傳統的服務器tomcat和weblogic等有點區別,所以androidpn也有jetty的影子,在和我們傳統架構組合的時候還要再把它和jetty拆開, androidpn的搭建和使用網上的教程很多,大家可以發現大部分千篇一律,出現一個OK界面就沒了,堂而皇之的寫上原創,有的只是改了下hello world,如此糊弄,實在難為所用!
androidpn消息推送采用的是apache的mina框架做的,服務端和客戶端兩邊都有監聽,也就是我們所說的socket編程,有人說socket編程有什麼難的,就那麼回事,其實不然,我們平時寫的socket聊天都只是在局域網的,但是要穿透路由和防火牆,讓信息安全及時的傳送到另一個網關的局域網電腦中,就不是一件簡單的活了,其中涉及到在nat上打洞,還有線程,斷網重連,安全加密等等,那麼androidpn配合mina相當於把這些活都干了,那麼我們要的干活就相對比較精細了,第一學習mina的安裝配置的規則,第二學習xmpp協議組裝和解析的規則,第三學習androidpn推和收消息的核心代碼,如此三點我們便能靈活駕馭住androidpn出現再大的問題自己也能動手去調了。在和spring整合的時候大家要注意不要讓mina服務啟動2次,筆者整合時候無意發現在linux64位系統,weblogic上啟動時候總是報5222已經被占用,反復查看代碼發現mina在隨web容器啟動過一次5222端口後,xmppserver類中的start方法中ClassPathXmlApplicationContext類又加載了一次spring配置,導致端口被重復開啟兩次,後來將spring配置重新修了下,保證配置了mina的xml只被加載一次,在相同加載模式下spring的bean單例確實不會重復創建,但是ClassPathXmlApplicationContext加載模式必定會導致mina端口實例連同所有實例重新被加載,畢竟不在一個內存中管理,統一管理即可解決問題!網上現在也有不少androidpn版本,五花八門什麼都有,裡面到底有沒問題,改了什麼沒改什麼都不知道,基本上已經追溯不到原創到底是誰了,索性就只能從國外的一個網站上下了一個比較可靠的版本自己動手去量身改造,終於出了一個比較穩定版本。而且筆者把離線消息也做了進去,用戶只要沒收到提醒,當他恢復連接時離線消息就會被推送過來。
對於消息提醒來說,它僅僅是個notification,許多人非要把業務數據也做進去,更有誇張好幾兆的xml數據就這麼硬塞提醒過去,這種做法本身就背離了設計的初衷,非要把跑車當牛車使能不出問題嗎?其實業務數據還是用http拉比較好,xmpp及時的前提是用資源消耗作為代價的,我們能適度就適度用,用好用穩就行!如果這樣就結束了還不算太華麗,筆者教大家如何將自己家裡的局域網電腦免費發布到外網作為服務器,或者你有了答案,申請個花生殼賬戶就可以送一個免費的域名,將花生殼域名客戶端在你的客戶端啟動起來,然後打開你的路由管理,在轉發規則中->虛擬服務器->添加新條目,服務器端口號填寫5222 ip填寫你的內網地址,再添加一個條目,服務器端口填寫你的中間件端口,我的是8080,ip填寫你的內網地址,最後重啟路由,好了現在把你的花生殼域名輸入到浏覽器 xxx.xicp.net:8080/xxx 就可以隨時隨地在外網使用消息推服務了,最後將你的手機端配置改成花生殼域名xxx.xicp.net,就可以收到消息。 www.2cto.com
項目源碼下載: Androidpn威力加強版
搭建步驟:
1.android端找到res/raw/androidpn.properties文件修改服務器ip地址,不要寫localhost,寫絕對ip地址
2.服務端找到resources/jdbc.properties 在mysql中新建一個數據庫apn,並將連接指向該庫,設置用戶名和密碼,庫表會隨服務啟動的時候自動創建
3.先啟動服務,再打開android客戶端,點擊連接即可
使用HttpURLConnection 在Android上發送HTTP請求的方式一般有兩種,HttpURLConnection和HttpClient,現在先學習下 H
Android切圖注意事項 1. 切圖需要兩套分辨率的圖:480*800,720*1280。分被放在不同的文件夾中,同一張圖片,在兩個文件夾中的名字要一致。 2.
前言很多團隊都有接入Android Andfix的剛性需求,但是早些版本的Andfix接入成本略高。如只支持maven工程、定制的打包插件有很多額外限制、摩天輪打包不支持
新的Java8 API中提供了不少新的特性,其中就有Lambda表達式。而本文我們將主要介紹一下在Android開發過程中如何使用Lambda表達式,這裡主要是為我們後續