Androidpn包含兩個包:服務器和客戶端。服務器部分可以單獨作為服務器運行,也可以嵌入到web項目的servlet中,與tomcat環境中web項目的其他部分進行交互。androidpn的簡單用法網上很多文章都有介紹,這裏就不細說了。本文主要討論如何將androidpn與您自己的web程序集成在壹起。
服務器部分的主要包結構如下:
其中org.androidpn.server.dao、org.androidpn.server.model和org.androidpn.server.service使用hibernate鏈接數據庫並實現簡單的用戶登錄認證,在開發中可以替換為我們自己的認證模塊。剩余的包是推送的主要實現。
接下來,看看每個包:
1.util包中的類用於加載資源中的配置文件,您可以在其中指定監聽端口和ssl證書目錄。
2.org.androidpn.server.xmpp包定義了壹些異常類型,主要包括入口類XmppServer,用於啟動和停止服務器程序。
包3 . org . androidpn . server . xmpp . auth包含壹些身份驗證類,我們自己的身份驗證模塊可以在這裏與Android pn結合使用。
4.org . androidpn . server . XMPP . codec是xmpp協議的XML文件解析包,服務器接收和發送的消息通過這個包進行xmpp協議的編碼和解碼。
5 . org . androidpn . server . xmpp . handler包主要處理消息,我們可以為不同的消息類型定義自己的處理程序。
6.org.androidpn.server.xmpp.net包負責維護與客戶端的持久連接,並實現壹些發送xmpp消息的傳輸模式。
7 . org . androidpn . server . xmpp . presence僅包含PresenceManager類,該類用於維護客戶端的在線狀態。
8 . org . androidpn . server . xmpp . push包中的NotificationManager類包含壹個向客戶端發送消息的接口。
9 . org . androidpn . server . xmpp . router包負責將收到的數據包發送到相應的處理程序進行處理,它是壹個路由包。
包10 . org . androidpn . server . xmpp . session定義了用於表示持久鏈接的會話,每個會話都包含連接的狀態信息。
11 . org . androidpn . server . xmpp . ssl是用於連接的SSL身份驗證的工具包。
服務器發送消息的整個過程主要是:
1的推送界面。調用NotificationManager。
2.使用sessionManager在當前會話集合中查找相應的客戶端鏈接。
3.定義自己的XMPP消息格式並組裝它。
4.通過相應的會話向客戶端發送消息。
在這個過程中我們需要修改的是步驟3,即我們需要定義和組裝自己的xmpp消息,以便於向客戶端傳輸適當的信息,並方便客戶端的解析。消息組裝的壹個簡單示例如下:
private IQ createMessageIQ(字符串標題,字符串消息,字符串用戶Id,
字符串JSON ){
element notification = document helper . createelement(qname . get(
“message“,INQURIE _ NAMESPACE));
notification . addelement(“title“)。setText(標題);
notification.addElement(“文本“)。setText(消息);
notification . addelement(“userId“)。setText(userId);
notification . addelement(“JSON“)。setText(JSON);
IQ智商=新智商();
IQ . settype(IQ。type . set);
iq.setChildElement(通知);
回歸智商;
}
應該註意的是,在創建元素時,傳入的名稱空間應該與用於客戶端解析的名稱空間相匹配。
服務器端接收和處理消息的過程如下:
1.connection接收數據包並使用tsc.push.server.xmpp.codec對其進行解碼
2 .路由器根據信息(例如數據包的名稱空間)將數據包路由到相應的處理器。
3.handler處理它。
相應的路由器和處理程序類在androidpn中有可供參考的示例,因此這裏將不發布代碼。在開發中,您只需要根據客戶端發送的消息格式定義自己的路由器和處理程序類,然後在PacketRouter中註冊路由器,在IQRouter中註冊處理程序。
客戶端部分的主要包結構如下:
這壹邊包括發送和接收消息、解析以及啟動和重新連接持久連接的功能,非常強大。當我們開發時,我們完全不用擔心底層連接,我們可以專註於業務部分的開發。
同時,代碼結構簡單。除了android的服務和廣播類以及壹些工具類和常量類之外:
1.NotificationIQ、NotificationIQ提供程序和NotificationPacket偵聽器負責解析和處理收到的通知格式的消息。
2.XmppManager是主控制器,NotificationService通過該類在後臺維護androidpn連接。
3.PersistentConnectionListener、PhoneStateChangeListener和ReconnectionThread.java負責監控移動電話的狀態並執行斷開連接和重新連接。
當我們自定義消息時,需要定義三個類:在***IQ中定義消息的實體,在* * IQ provider中將消息轉換為***IQ實體,在***PacketListener中處理實體。具體實現請參考三個類:通知IQ、通知IQ提供者和通知數據包監聽器。定義這些類之後,您需要在XmppManager中將這三個類註冊到connection中。代碼如下:
//連接任務
connection . connect();
log . I(log tag,“XMPP連接成功”);
//數據包提供者
ProviderManager.getInstance()。addiq provider(“message“,
常數。通知名稱空間,
new notification IQ provider());
//LoginTask
//數據包過濾器
packet filter packet filter = new packet type filter(
notification IQ . class);
//數據包偵聽器
packet listener packet listener = xmpp manager
。getNotificationPacketListener();
connection . addpacketlistener(packet listener,packet filter);
需要註意的是,在註冊***IQProvider時,傳入的名稱空間需要與服務器在組裝消息時使用的名稱空間壹致,以便正確接收消息。