一.聊天軟件背景
1.聊天軟件,就是通常我們說的即時聊天工具IM,我們常用的聊天軟件有QQ,微信,飛信等。
2.需要協議支持,傳統的socket編程並不滿足聊天的功能,比如服務器與客服端的雙向交互,消息的雙向推送。
3.在移動互聯網時代,我們需要基於移動終端開發新型的聊天軟件,以滿總大眾的需求,常用的移動設備終端操作系統ios,android,wp7等等。
二.技術背景
1.在開發Android和iPhone應用程序時,我們往往需要從服務器不定的向手機客戶端即時推送各種通知消息,iPhone上已經有了比較簡單的和完美的推送通知解決方案,
可是Android平台上實現起來卻相對比較麻煩,最近利用幾天的時間對Android的推送通知服務進行初步的研究。
在Android手機平台上,Google提供了C2DM(Cloudto Device Messaging)服務,起初我就是准備采用這個服務來實現自己手機上的推送功能。
Android Cloud to Device Messaging (C2DM)是一個用來幫助開發者從服務器向Android應用程序發送數據的服務。該服務提供了一個簡單的
、輕量級的機制,允許服務器可以通知移動應用程序直接與服務器進行通信,以便於從服務器獲取應用程序更新和用戶數據。
C2DM服務負責處理諸如消息排隊等事務並向運行於目標設備上的應用程序分發這些消息。
但是經過一番研究發現,這個服務存在很大的問題:
1)C2DM內置於Android的2.2系統上,無法兼容老的1.6到2.1系統;
2)C2DM需要依賴於Google官方提供的C2DM服務器,由於國內的網絡環境,這個服務經常不可用,如果想要很好的使用,
我們的App Server必須也在國外,這個恐怕不是每個開發者都能夠實現的;
有了上述兩個使用上的制約,導致我最終放棄了這個方案,不過我想利用另外一篇文章來詳細的介紹C2DM的框架以及客戶端和App Server的相應設置方法,可以作為學習與參考之用。
即然C2DM無法滿足我們的要求,那么我們就需要自己來實現Android手機客戶端與App Server之間的通信協議,保證在App Server想向指定的Android設備發送消息時,Android設備能夠及時的收到。下面我來介紹幾種常見的方案:
1)輪詢:應用程序應當階段性的與服務器進行連接並查詢是否有新的消息到達,你必須自己實現與服務器之間的通信,例如消息排隊等。而且你還要考慮輪詢的頻率,如果太慢可能導致某些消息的延遲,如果太快,則會大量消耗網絡帶寬和電池。
2)SMS:在Android平台上,你可以通過攔截SMS消息並且解析消息內容來了解服務器的意圖。這是一個不錯的想法,我就見過采用這個方案的應用程序。這個方案的好處是,可以實現完全的實時操作。但是問題是這個方案的成本相對比較高,你很難找到免費的短消息發送網關,關於這個方案的實現,可以參考如下鏈接:https://labs.ericsson.com/apis/mobile-java-push/。
3)持久連接:這個方案可以解決由輪詢帶來的性能問題,但是還是會消耗手機的電池。Apple的推送服務之所以工作的很好,是因為每一台手機僅僅保持一個與服務器之間的連接,事實上C2DM也是這么工作的。不過這個方案也存在不足,就是我們很難在手機上實現一個可靠的服務。Android操作系統允許在低內存情況下殺死系統服務,所以你的通知服務很可能被操作系統Kill掉了。
前兩個方案存在明顯的不足,第三個方案也有不足,不過我們可以通過良好的設計來
三.開發協議
1.目前主流的四種IM(IM:instant messaging,即時消息)分別為:
XMPP(Extensible Messageing and Presence Protocol:可擴展消息與存在協議);
即時信息和空間協議(IMPP);
空間和即時信息協議(PRIM);
針對即時通訊和空間平衡擴充的進程開始協議SIP(SIMPLE)。
2.在這四種協議中,XMPP是最靈活的。
XMPP是一種基於XML的協議,它繼承了在XML環境中靈活的發展性。因此,基於XMPP的應用具有超強的可擴展性。
經過擴展以后的XMPP可以通過發送擴展的信息來處理用戶的需求,以及在XMPP的頂端建立如內容發布系統和基於地址的服務等應用程 序。
而且,XMPP包含了針對服務器端的軟件協議,使之能與另一個進行通話,這使得開發者更容易建立客戶應用程序或給一個配好系統添加功能.
3.XMPP系統特點:
(1)客戶機/服務器通信模式;
(2)分布式網絡;
(3)簡單的客戶端;
(4)XML的數據格式。
三.協議的實現及開發工具包
1.android使用xmpp協議進行即時通信,所涉及3個主要的東西,它們是openfire、Asmack和spark,這三個東東結合起來就是完整的xmpp IM實現:
(1)基於java的開源XMPP協議包Asmack,在pc機上,有實現XMPP協議包smack,但在精簡了jdk的android系統上,會出現一些類缺失,
但在2010年初,有人在code.google.com網站上發布了一個Asmack,其中A庫就代表Android中的A,也就是說,這個版本是Smack的Android版本.
可使用下面地址下載Asmack.
http://code.google.com/p/asmack/downloads/list
(2)openfire主要是作為服務器,負責管理客戶端的通信連接,以及提供客戶端一些通信信息和連接信息。
(3)Spark 是PC機上IM客戶端的實現,其實就是使用了smack 的api實現的。
(4)官方下載:http://www.igniterealtime.org/downloads/index.jsp
四。參看資料
http://www.apkbus.com/android-23750-1-1.html
轉載請注明出處:http://www.cnblogs.com/hpboy