基於XMPP協議(openfire服務器)的消息推送實現


基於XMPP協議(openfire服務器)的消息推送實現 - nomousewch的專欄 - 博客頻道 - CSDN.NET

 最近好像有不少朋友關注Android客戶端消息推送的實現,我在之前的項目中用到過Java PC客戶端消息推送,從原理講上應該是一致的,在這里分享一下個人的心得。

  • 消息推送實現原理
        這里的消息推送,通常是指由服務器端向客戶端發送的一些消息,比如待辦事宜、新聞等等。
        從技術角度來看,消息推送本質上是基於TCP/IP的網絡IO流傳輸,只不過這個IO流看起來由服務器發起,從上面的條件來看,一個基本的消息推送框架的Java實現應該是這樣的:有一個用Java NIO實現的服務器,多個用socket連接到此服務器的客戶端,然后之間用二進制流傳輸信息。說起來簡單,實現起來卻很不容易,所幸基於XMPP協議的openfire剛好符合上述條件,不僅如此,這種方案還有如下優點:
  1. openfire是開源的,用Java寫的,這對Java程序員來說很重要。。。
  2. XMPP協議采用XML流傳輸消息,可讀性和可擴展性優秀,便於我們定義自己的推送消息結構。
  3. 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中建立一個插件,這里貼一下核心代碼:
  1. public static void pushMessage(JID to, JID from, String body,  
  2.         String subject) {  
  3.     Message message = new Message();  
  4.     message.setFrom(from);  
  5.     message.setTo(to);  
  6.     message.setBody(body);  
  7.   
  8.     if (StringUtils.isNotBlank(subject)) {  
  9.         message.setSubject(subject);  
  10.     }  
  11.   
  12.     XMPPServer.getInstance().getRoutingTable().routePacket(to, message, true);  
  13. }  
	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,來向指定用戶推送消息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM