基於XMPP協議(openfire服務器)的消息推送實現 - nomousewch的專欄 - 博客頻道 - CSDN.NET
最近好像有不少朋友關注Android客戶端消息推送的實現,我在之前的項目中用到過Java PC客戶端消息推送,從原理講上應該是一致的,在這里分享一下個人的心得。
- 消息推送實現原理
這里的消息推送,通常是指由服務器端向客戶端發送的一些消息,比如待辦事宜、新聞等等。從技術角度來看,消息推送本質上是基於TCP/IP的網絡IO流傳輸,只不過這個IO流看起來由服務器發起,從上面的條件來看,一個基本的消息推送框架的Java實現應該是這樣的:有一個用Java NIO實現的服務器,多個用socket連接到此服務器的客戶端,然后之間用二進制流傳輸信息。說起來簡單,實現起來卻很不容易,所幸基於XMPP協議的openfire剛好符合上述條件,不僅如此,這種方案還有如下優點:
- openfire是開源的,用Java寫的,這對Java程序員來說很重要。。。
- XMPP協議采用XML流傳輸消息,可讀性和可擴展性優秀,便於我們定義自己的推送消息結構。
- XMPP協議在PC和Android分別有對應的協議實現smack和asmack,不用我們寫XML協議解析。
那么具體如何實現在openfire中推送消息呢?我的想法是這樣的:當兩個用戶使用openfire中聊天時,消息是從用戶A經過服務器流向用戶B,那么我們可以想象有消息中心這么一個用戶,它的作用就是當我們系統有需要時,向某個用戶發一條相應的消息,我們的客戶端收到這樣一個用戶的消息時,就將其當做系統消息,這樣就實現了簡單的消息推送。還有一個問題就是,系統怎么知道向哪個用戶推送消息、什么時候推送消息,我們可以用http post的方式通知openfire服務器,用參數指定消息體和發送對象。
- 使用openfire實現消息推送
第一步,使用openfire進行消息推送的前提是在openfire系統中注冊賬號,有關openfire賬號整合自定義數據庫請看我的另一篇文章 http://blog.csdn.net/nomousewch/article/details/7546083,這里就不說了。第二步,在openfire中建立一個插件,這里貼一下核心代碼:
- public static void pushMessage(JID to, JID from, String body,
- String subject) {
- Message message = new Message();
- message.setFrom(from);
- message.setTo(to);
- message.setBody(body);
- if (StringUtils.isNotBlank(subject)) {
- message.setSubject(subject);
- }
- XMPPServer.getInstance().getRoutingTable().routePacket(to, message, true);
- }
public static void pushMessage(JID to, JID from, String body, String subject) { Message message = new Message(); message.setFrom(from); message.setTo(to); message.setBody(body); if (StringUtils.isNotBlank(subject)) { message.setSubject(subject); } XMPPServer.getInstance().getRoutingTable().routePacket(to, message, true); }第三步,在插件中定義一個Servlet,調用上述方法。
第四步,在業務系統中用http client調用Servlet,來向指定用戶推送消息。