使用Pushlet向指定用戶推送消息

問題的關鍵就是那個SessionID,Pushlet默認是用java.rmi.server.UID參數的隨機字符串作爲會話標誌,這就造成我們沒法跟一個特點的用戶對應上,也就是說客戶必須在joinListen的時候提供一個他的ID,就像登陸qq時,輸入用戶名一樣。

好了,這裏就列出怎麼修改相關代碼,實現上述功能。

同樣,首先用MyEclipse新建一個web工程,我這裏命名爲PushletTest2。不同的是,我們不引用pushlet.jar包了,因爲我們要更改源碼,在下載pushlet的時候裏面就包含源代碼了,最外層是nl包,加入我的工程的src裏。好了,加進去之後會報錯,將log4j.jar加入引用就好了。。之後,同樣別忘了把pushlet.properties和sources.properties加入WebRoot/WEN-INF下。工程結構如下:

FirPush.java是自己寫的一個觸發推送動作的類,它是一個servlet,請求該servlet就觸發向特定的用戶推送信息的動作(當然,怎麼觸發推送動作還有很多種形式)。

web.xml代碼如下:

Xml代碼  收藏代碼
  1. <span style="font-size: x-small;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7.     <servlet>  
  8.        <servlet-name>pushlet</servlet-name>  
  9.        <servlet-class>nl.justobjects.pushlet.servlet.Pushlet</servlet-class>  
  10.        <load-on-startup>3</load-on-startup>  
  11.     </servlet>  
  12.     <servlet>   
  13.     <servlet-name>FirePush</servlet-name>  
  14.         <servlet-class>com.mysrc.FirePush</servlet-class>  
  15.     </servlet>      
  16.     <servlet-mapping>  
  17.        <servlet-name>pushlet</servlet-name>  
  18.        <url-pattern>/pushlet.srv</url-pattern>  
  19.     </servlet-mapping>      
  20.     <servlet-mapping>  
  21.        <servlet-name>FirePush</servlet-name>  
  22.        <url-pattern>/FirePush</url-pattern>  
  23.     </servlet-mapping>      
  24.   <welcome-file-list>  
  25.     <welcome-file>index.jsp</welcome-file>  
  26.   </welcome-file-list>  
  27. </web-app></span>  

 Ok,接下來就是要進行修改了,首先打開ajax-pushlet-client.js。PL對象,在它的最開始添加一個屬性userId:'',  ,因爲分析ajax-pushlet-client.js之後會發現,所有的請求都是get方式,也就是說是將請求參數添加到url裏的,我們要做的是在進行join請求的時候將userId加到url上。找到PL的_doRequest,它是一個函數,所有的請求都是通過調用它發出的,找到var url = PL.pushletURL + '?p_event=' + anEvent;這一行,這兒就是在構造請求參數,在它的後面加入代碼:

Js代碼  收藏代碼
  1. if (anEvent == 'join' || anEvent == 'join-listen') {    url = url + '&userId=' + PL.userId;   
  2.         }  

 好了,ajax-pushlet-client.js的修改就完成了。

接下來是test.html:

Html代碼  收藏代碼
  1. <html>  
  2.   <head>  
  3.   <script type="text/javascript" src="ajax-pushlet-client.js"></script>   
  4.   <script type="text/javascript">    
  5.          PL.userId='piero';  
  6.          PL._init();    
  7.          PL.joinListen('myevent1');   
  8.          function onData(event) {   
  9.             alert(event.get("key1"));    
  10.          }  
  11.   </script>   
  12.   </head>  
  13.   <body>  
  14.     This is pushlet test page....<br>  
  15.   </body>  
  16. </html>  

然後就是修改pushlet的java源代碼,找到nl.justobjects.pushlet.core包下的SessionManager類,將它的createSession方法改成:

Java代碼  收藏代碼
  1. public Session createSession(Event anEvent) throws PushletException {  
  2.         // Trivial  
  3.         //return Session.create(createSessionId());  
  4.         return Session.create(anEvent.getField("userId""visitor"));  
  5.     }  

 這兒就使得建立的session的id是發送過來的userId,而不是一個隨機字符串。getField的第二個參數是當得不到請求參數userId的值的時候設定的默認值。

好了,所有的準備工作都完成了,接下來就是通過userId給特點的用戶推送信息了。

FirePush.java代碼如下:

Java代碼  收藏代碼
  1. package com.mysrc;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. import nl.justobjects.pushlet.core.Dispatcher;  
  11. import nl.justobjects.pushlet.core.Event;  
  12. import nl.justobjects.pushlet.core.SessionManager;  
  13.   
  14. public class FirePush extends HttpServlet {  
  15.   
  16.     @Override  
  17.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  18.             throws ServletException, IOException {  
  19.         myUnicast();  
  20.         //myMulticast();  
  21.         //myBroadcast();  
  22.     }  
  23.     private void myUnicast()  
  24.     {  
  25.         if(SessionManager.getInstance().hasSession("piero")){  
  26.             Event  event = Event.createDataEvent("myevent1");   
  27.             event.setField("key1""houhou_yesttttt....");            
  28.             Dispatcher.getInstance().unicast(event,"piero"); //向ID爲piero的用戶推送  
  29.                 
  30.             System.out.println("success....");  
  31.         }  
  32.         else {  
  33.             System.out.println("piero do not login....%%%%%%%%%%%%");  
  34.         }  
  35.     }  
  36.     private void myMulticast()  
  37.     {  
  38.         Event  event = Event.createDataEvent("myevent1");   
  39.         event.setField("key1""houhou....");    
  40.         Dispatcher.getInstance().multicast(event);  //向所有和myevent1名稱匹配的事件推送  
  41.           
  42.         System.out.println("wa success....");  
  43.     }  
  44.     private void myBroadcast()  
  45.     {  
  46.         Event  event = Event.createDataEvent("myevent1"); //向所有的事件推送,不要求和這兒的myevent1名稱匹配  
  47.         event.setField("key1""dig hole....");      
  48.         Dispatcher.getInstance().broadcast(event);  
  49.           
  50.         System.out.println("asw success....");  
  51.     }  
  52. }  

 這兒主要利用了dispatcher的unicat/multicat/broadcast方法。

好了,值得一提的是在ajax-pushlet-client.js有publish方法,也就是上面提到的觸發信息推送動作,其實完全可以在前端調用這個js的publish函數向訂閱了某事件的所有網頁推送信息。test2.html代碼如下:

Html代碼  收藏代碼
  1. <html>  
  2.   <head>  
  3.   <script type="text/javascript" src="ajax-pushlet-client.js"></script>   
  4.   <script type="text/javascript">   
  5.          PL.userId='juvenh';  
  6.          PL._init();   
  7.                 
  8.          PL.joinListen('event223');   
  9.          function onData(event) {   
  10.                alert(event.get("eventVal"));    
  11.          }  
  12.            
  13.          function sendnews(){   
  14.             //PL.publish("myevent1","key1=dlut&ba=ls");   
  15.             p_publish('myevent1', 'key1', 'dlut', 'ba', 'ls');  
  16.         }  
  17.   </script>   
  18.   </head>  
  19.     
  20.   <body>  
  21.     This is my JSP page. <br>  
  22.     <input type = "button" value="發消息" onclick="sendnews()"/>   
  23.   </body>  
  24. </html>  

 上面代碼中的PL.publish和p_publish完全等效,查看p_publish的代碼,其實也是構造請求url。這兒的publish方法只能向訂閱某一事件的所有網頁推送消息,也即等同於multicast方法,無法向某一個特定的用戶推送,解決方法還是向上面那樣修改pushlet的java源代碼,在nl.justobjects.pushlet.core包下的Controller.java中的protected void doPublish(Command aCommand);函數,看一下就會發現,這兒就是調用了dispacher的multicast函數,這兒改成unicast,前提是上面的js的publish裏提供了userId。


藉助以上資料 我做成了一個指定用戶推送消息,下載路徑:http://www.zuidaima.com/share/1698974463347712.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章