androidpn是一個基於XMPP協議的java開源Android push notification實現。它包含了完整的客戶端和服務器端。通過源代碼研究我發現,該服務器端基本是在另一個開源工程openfire基礎上修改實現的,不過比較鬱悶的是androidpn的文檔是由韓語寫的,因此整個研究過程基本都是讀源碼。它的實現示意圖以下:java
androidpn客戶端須要用到一個基於java的開源XMPP協議包asmack,這個包一樣也是基於openfire下的另一個開源項目smack,不過咱們不須要本身編譯,能夠直接把androidpn客戶端裏面的asmack.jar拿來使用。客戶端利用asmack中提供的XMPPConnection類與服務器創建持久鏈接,並經過該鏈接進行用戶註冊和登陸認證,一樣也是經過這條鏈接,接收服務器發送的通知。android
androidpn服務器端也是java語言實現的,基於openfire開源工程,不過它的Web部分採用的是spring框架,這一點與openfire是不一樣的。Androidpn服務器包含兩個部分,一個是偵聽在5222端口上的XMPP服務,負責與客戶端的XMPPConnection類進行通訊,做用是用戶註冊和身份認證,併發送推送通知消息。另一部分是Web服務器,採用一個輕量級的HTTP服務器,負責接收用戶的Web請求。服務器架構以下:spring
最上層包含四個組成部分,分別是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager負責管理客戶端與服務器之間的會話,Auth Manager負責客戶端用戶認證管理,Presence Manager負責管理客戶端用戶的登陸狀態,NotificationManager負責實現服務器向客戶端推送消息功能。服務器
服務器端界面以下,分別對應了上述的幾個功能模塊:架構
發送之後,咱們能夠在手機端看到接收的消息:併發
這個解決方案的最大優點就是簡單,咱們不須要象C2DM那樣依賴操做系統版本,也不會擔憂某一天Google服務器不可用。利用XMPP協議咱們還能夠進一步的對協議進行擴展,實現更爲完善的功能。框架
採用這個方案,咱們目前只能發送文字消息,不過對於推送來講通常足夠了,由於咱們不能期望經過推送獲得全部的數據,通常狀況下,利用推送只是告訴手機端服務器發生了某些改變,當客戶端收到通知之後,應該主動到服務器獲取最新的數據,這樣纔是推送服務的完整實現。jsp