使用androidpn來實現推送
阿新 • • 發佈:2019-01-06
公司做了一個手機軟體需要及時通知使用者. 本來想找個哥們做個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框架寫一個簡單功能版本的推送實現,方便大家修改
-----------------------------------
------------------------以下是網上摘操--------------------------
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框架寫一個簡單功能版本的推送實現,方便大家修改
-----------------------------------