1. 程式人生 > >使用androidpn來實現推送

使用androidpn來實現推送

公司做了一個手機軟體需要及時通知使用者. 本來想找個哥們做個c的長連結服務端,哪想這哥們找了個開源的linux下的c開發的chat服務端給我,還得自己研究文件,再做個使用者關聯介面把chat服務當訊息中轉,麻煩. 上網搜了一下看看有什麼更合適的方案.發現有個開源的android push notification,簡稱androidpn. 正好公司的業務後端是java的,把androidpn融合在裡面應該是一個不錯的選擇.

------------------------以下是網上摘操--------------------------

Androidpn在客戶端集成了asmack。這樣就可以很容易的簡立一個和伺服器端的基於xmpp協議的socket連線。Androidpn的客戶端中,進行管理連線的類是XmppManager,它主要用來管理連線的資訊,比如XMPP的埠、IP、登入的使用者名稱密碼,以及對連線的維護。為什麼還有使用者名稱和密碼?這不得不提到XMPP的具體細節。整個伺服器端和客戶端的通訊是基於一個session(會話)過程,會話開始,首先會指定伺服器的埠號,然後把上述提到的資訊傳送到伺服器端,怎麼傳送訊息的呢?以<stream>根節點的方式開始傳遞,只有在伺服器和客戶端關閉的時候才會傳送它的結束標記</stream>。客戶端通過XMPP協議只用做的就是接收訊息,而所有其它的操作都交給伺服器,比如管理連線、訊息儲存等等,這樣就很大程度的減輕了客戶端的負擔。那麼客戶端和伺服器端的訊息迴應是如何實現的?如要通過一個ID來標識,具體細節可以去檢視XMPP協議。

一旦註冊繫結後,伺服器端就和客戶端建立了連線,客戶端只用負責去接收訊息。所以當我們應用Androidpn的時候,客戶端會非常的簡單。而在伺服器端,Androidpn又做了什麼呢?

伺服器端的展示方面,androidpn主要用到的技術是Spring和Hibernate。

在伺服器端的原始碼中一個org.androidpn.server.xmpp.net.Connection類,主要是代表一個伺服器上的XMPP連線,注意只是一個,它可以確保在伺服器關閉的時候,傳送一個</stream>標記到客戶端,告知連線斷開,需重新連線。

org.androidpn.server.xmpp.session.SessionManager主要使用者管理所有會話,比如連線斷開,刪除session以及建立連線,新增session等等。

而在管理Socket連線的時候,androidpn採用了MINA框架來進行管理,MINA的優點就是改變了我們傳統的管理socket的方式,比如沒建立一個socket開一個執行緒,而MINA可以實現多個執行緒管理N多個使用者。在處理高併發的推送上無疑是有巨大的好處的。

合理的利用監聽器來管理session,也是androidpn的優點。在安全性方面,制定了TLS(安全傳輸層)策略,並卻採用了安全認證,這些方面都做的不錯。

當然,不可避免的30秒鐘的心跳包還是必不可少的。


---------------------------------------------------------

下載了服務端,伺服器端解壓開點選bin下的run.bat執行服務端.
下載客戶端, 修改手機客戶端的連線ip地址為電腦區域網的ip,編譯安裝apk到手機,客戶端就一個很簡單的activity,後臺服務自動與服務端進行連線.

開啟管理後臺http://127.0.0.1:7070 看到有一個使用者,那就是我的手機,點選notification給手機段發一條通知,Ok立即收到。

接下來就是把android完美的整合到現有的業務系統中去了。

花了一個下午的時間把後臺修改成spring + hibernate + struts2 + tomcat能正常地跑起來了,經測試和手機連線正常發訊息沒有問題。


(ssh版本)其他地方的修改

(一)請修改 XmppServer 的start方法

遮蔽掉context = new ClassPathXmlApplicationContext("spring-config.xml");

改為使用ApplicationContextAware 介面中的

public void setApplicationContext(ApplicationContext context) throws BeansException

方法,獲得ApplicationContext物件。

否則會啟動了2個名為ioAcceptor的NioSocketAcceptor例項,可以檢視log日誌,在tomcat的log目錄下的androidpn.log日誌,浪費資源

而且在linux系統下會提示5552埠被佔用

(二) <bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor"
init-method="bind" destroy-method="unbind">

修改成destroy-method="disponse">能快速關閉tomcat程序

(三)把使用者系統融合到自己的應用中去,請修改org.androidpn.server.service.impl.UserServiceImpl
,使用自己系統的使用者介面

(四)客戶端自動註冊使用的隨機串,如果要使用自己系統的使用者,客戶端請修改org.androidpn.client.XmppManager 中的username和password

並用修改伺服器端的使用者身份驗證類org.androidpn.server.xmpp.auth.AuthManager的public static AuthToken authenticate(String username, String token,
String digest) throws UnauthenticatedException 方法


-----------------------------------

一直陸續有不少網友問我要androidpn整合ssh的原始碼,這個已經找不到了。不過稍微熟悉ssh的開發人員應該都會修改。

大家這麼熱情,我準備抽空用mina框架寫一個簡單功能版本的推送實現,方便大家修改

-----------------------------------