android基於xmpp的即時通訊應用

        xmpp是一個通信協議。因爲這是個開放的協議,爲了節儉開發成本,很多即時應用都採用了這個協議。Android上最常用的組合asmack +openfire。Asmack是smack的android版,是對xmpp協議進行了封裝,並提供了豐富的api,簡化了操作。Openfire是一個開源的IM服務器,基於Xmpp實現。換句話說使用xmpp開發即時通訊應用的話,服務器端已經開發好了,就是openfire。

 

        現在我做的一個android應用就是採用asmack+openfire。說實在的,xmpp協議太多了,大多都是英文的,去學這個東西成本高,但是如果不學,僅僅依賴openfire+asmack提供的功能很難滿足多樣性的需求。Openfire因爲是開源的,所以可以進行插件開發或者二次開發去滿足自己業務需求。xmpp還增加了Jingle擴展協議來支持面向連接的業務,如語音和視頻。

        之前業界xmpp最典型的例子就是Google talk,而且之前Google一直力推xmpp協議。但是Google最新的IM軟件Hangouts並沒有採用xmpp協議,對這一做法Google也沒有一個明確的回答。Google這一做法的確降低的xmpp的熱度。另外很多人說xmpp傳輸效率低,xmpp使用xml格式數據進行通信,過多的標籤的確可能降低傳輸效率。再說現在的國內主流的IM軟件,QQ,微信等,都是採用自己私有的通信協議。Openfire採用的TCP連接,QQ採用TCP+UDP。

        是開發自己的協議,是使用xmpp協議,還是用封裝好的xmpp協議(smack)+現成的服務器(openfire)就是大家的決定了。不過要說的是三種方案靈活性依次降低,成本也依次降低。我們項目的預算比較低所以採用了asmack+openfire。不過這裏我要說的是僅僅依賴asmack+openfire是滿足不了常規的業務需求的。所以我們的項目引入了webservice,同時嘗試對openfire進行插件開發。

        這裏我可以說說asmack+openfire開發遇到的一些無力的地方,比如:

        用戶無法接受離線的圖片,語音。

        羣成員在離線後就會離開羣(細來說,smack沒有羣的概念,只有個聊天室)

        羣聊裏沒有辦法發圖片(點對點的時候發送圖片使用的是文件傳輸,只能一對一,不能一對多)


        其他的問題就不在細說。對於上述的問題會在後續的文章中分享自己的解決方案。

Xmpp最大的優勢是什麼,在我看來就是開源。這種開源可以讓任意兩個使用xmpp協議的軟件進行通信。

開發之前有必要了解一些xmpp的一些數據結構。Xmpp連接使用xml流,這個XML流相當於一個會話期間所有XML節的一個信封

  |--------------------|
  | <stream>           |
  |--------------------|
  | <presence>         |
  |   <show/>          |
  | </presence>        |
  |--------------------|
  | <message to='foo'> |
  |   <body/>          |
  | </message>         |
  |--------------------|
  | <iq to='bar'>      |
  |   <query/>         |
  | </iq>              |
  |--------------------|
  | ...                |
  |--------------------|
  | </stream>          |
  |--------------------|

上圖中的幾個節點 presence、message、IQ對應着asmack的3個對象。這些都是packet的子類。

 

        關於asmack的api,沒有找到單獨的asmack api,更沒有中文的。大家可以再下載jar包的同時選擇下載源碼。Eclipse引用源碼後,通過javadoc就可以看到接口說明了,和api無異。





asmack官網:https://github.com/Flowdalic/asmack

asmack下載地址:http://asmack.freakempire.de/

openfire下載地址:http://www.igniterealtime.org/downloads/index.jsp

smack使用指南:http://www.igniterealtime.org/builds/smack/docs/latest/documentation/index.html

下載openfire的同時,大家可以下載spark測試用

 

更新2015-3-12

現在smack(4.1以上版本)已經可以直接跑在Android平臺上了,以後asmack也沒有更新的必要了。這次smack做了針對Android平臺做了很多的優化,也是smack一次里程碑式的更新。

此外設計方案上用openfire+smack+webservice 也許是更優秀的方案。也就是說 只使用smack的通訊功能,諸如好友關係,用戶資料這些東西都交給webservice去管理維護。

Smack參考:https://community.igniterealtime.org/blogs/ignite/2015/01/14/smack-410-beta1-available

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章