`

pushlet实现向特写用户实时推送信息

 
阅读更多

转自:http://blog.csdn.net/eagle199012/article/details/43307261

 

正文如下:

转自:http://blog.csdn.net/z69183787/article/details/21957275

环境:pushlet-2.0.4 

所遇问题: 
1.如何向特定用户推送 
参考网上资料:http://tonl.iteye.com/blog/1398995 
首先:修改ajax-pushlet-client.js,在PL对象后加入userId: 

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var PL = {
    NV_P_FORMAT: 'p_format=xml-strict',
    NV_P_MODE: 'p_mode=pull',
    pushletURL: null,
    webRoot: null,
    sessionId: null,
    STATE_ERROR: -2,
    STATE_ABORT: -1,
    STATE_NULL: 1,
    STATE_READY: 2,
    STATE_JOINED: 3,
    STATE_LISTENING: 3,
    state: 1,
    userId: '',//添加的userId变量

 在此代码后面加上

       // Construct base URL for GET
       var url = PL.pushletURL + '?p_event=' + anEvent;

1
2
3
4
if (anEvent == 'join' || anEvent == 'join-listen') {    url = url + '&userId=' + PL.userId;   

其次:修改pushlet源码,nl.justobjects.pushlet.core.SessionManager,将createSession方法修改如下: 

复制代码

1
2
3
4
5
6
7
8
/**
     * Create new Session (but add later).
     */
    public Session createSession(Event anEvent) throws PushletException {
        // Trivial
        //return Session.create(createSessionId()); //原写法
        return Session.create(anEvent.getField("userId""visitor"));//修改后的写法
    }

这是我们就获得的session的id就是我们传送过来的登陆用户userId,getField的第二个参数是当得不到请求参数userId的值的时候设定的默认值。 


最后:对修改过的源码进行编译打包 
编择:直接到下载的pushlet包下build 
打包:通过jar命令 
 



2.如何在配置的推送源中获取service对象 
参考:http://blog.csdn.net/zollty/article/details/8710911 
因为pushlet是在服务端做的轮询,并不经web容器,所以不能自动注入,要手动获取,方法如下: 

复制代码

1
2
3
4
5
6
applicationContext = sessions.length > 0 && applicationContext == null ?
                    ContextLoaderListener.getCurrentWebApplicationContext()
                    : applicationContext;
renwuService = sessions.length > 0 && renwuService == null ?
                    (IRenwuService) applicationContext.getBean("renwuServiceImpl")
                    : renwuService;

注:IRenwuService 为消息接口,RenwuServiceImpl为接口实现类 

3.Spring 初始化的bean名称是什么 
看到2中getBean("renwuServiceImpl"), Spring容器初始化bean时,所有bean名称都以小写字母开头(这里从控制台也可以看出所有初始化bean的名称),所以bean名为renwuServiceImpl 


4.如果推信息为中文如何处理 
如查推送的信息为中文,前端JS不会返回信息,但从控制台可以看出,推送源已执行,但会自动将sessionId移除,如下图:
 

解决方法: 
new String("中文问题".getBytes("UTF-8"),"ISO-8859-1"); 


5.用Jquery实现无刷新框架要注的JS代码位置 
这里我是用 Jquery post方法在页面初始化时进行动态加载main页面,所以 

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
<script type="text/javascript">
<!--
  //pushlet
  if(PL.sessionId == null){
      PL.userId = '${userId}';
      PL._init();
      PL.joinListen('/pms/bxService');//事件标识 在数据源中引用
      function onData(event){
            console.log("sessionID==" + PL.sessionId + "====" + event.get('msg_' '${userId}'));
      }
  }
//-->
</script>


要放入最后回载的main页,不能放入在他之前加载的页面 


6.关于key的取值问题
复制代码

1
event.setField(key, value)


这里的key不能是数字(包括数字字符串),否则同样会出现4的问题 


=============================华丽的分隔线========================= 

完整配置代码: 


步骤一 创建一个类(事件推送源类)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.tony.demo.pushlet;
       
import java.io.Serializable;
       
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.context.ContextLoaderListener;
import com.tony.jrpms.service.IRenwuService;
import nl.justobjects.pushlet.core.Event;
import nl.justobjects.pushlet.core.EventPullSource;
import nl.justobjects.pushlet.core.Session;
import nl.justobjects.pushlet.core.SessionManager;
       
/**
 * @author Tony
 * @createDatime 2013-11-28 下午1:42:21
 */
@Controller
public class PmsEventPullSources implements Serializable {
       
    /**
     *
     */
    private static final long serialVersionUID = 8397335113632699297L;
           
    private static ApplicationContext applicationContext;
    private static IRenwuService renwuService;
       
    public static class BaoxiuEvent extends EventPullSource{
       
          @Override
          protected long getSleepTime() {
       
              return 1000//刷新时间
       
          }
       
          @Override
          protected Event pullEvent() {
       
            Event event = Event.createDataEvent("/pms/bxService");// 事件标识 // 注意:此处”/pms/bxService”将对应页面js代码中的PjoinListen中的参数
       
            // 获取当前登陆用户Id(加入事件订阅的用户)
            Session[] sessions = SessionManager.getInstance().getSessions();
                   
            applicationContext = sessions.length > 0 && applicationContext == null ?
                    ContextLoaderListener.getCurrentWebApplicationContext()
                    : applicationContext;
            renwuService = sessions.length > 0 && renwuService == null ?
                    (IRenwuService) applicationContext.getBean("renwuServiceImpl")
                    : renwuService;
                   
            //查询当前用户的任务
            for(int i=0; i<sessions.length; i++){
                       
                //查询当前登录用户的报修任务
                int bxCount = renwuService.totalRenwu(Integer.parseInt(sessions<i>.getId()));
                event.setField("msg_" + sessions<i>.getId(), bxCount);// 封装参数
                       
            }
            return event;
       
          }
       
      }
}</i></i>
步骤二 配置文件( sources.properties 

复制代码
1
source1=com.tony.demo.pushlet.PmsEventPullSources$BaoxiuEvent
将原有的source*全部注释或删除掉


步骤三 配置文件( web.xml  


复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- pushlet servlet 配置-->
    <servlet>
        <servlet-name>pushlet</servlet-name>
        <servlet-class>nl.justobjects.pushlet.servlet.Pushlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
           
    <!-- Define the Servlet Mappings. -->
       
    <!-- The pushlet -->
    <servlet-mapping>
        <servlet-name>pushlet</servlet-name>
        <url-pattern>/pushlet.srv</url-pattern>
    </servlet-mapping>


步骤四 jsp文件中js写法 

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
<script type="text/javascript">
<!--
  //pushlet
  if(PL.sessionId == null){
      PL.userId = '${userId}';
      PL._init();
      PL.joinListen('/pms/bxService');//事件标识 在数据源中引用
      function onData(event){
            console.log("sessionID==" + PL.sessionId + "====" + event.get('msg_' '${userId}'));
      }
  }
//-->
</script>

注:${userId}为当前登录用户的ID

分享到:
评论

相关推荐

    pushlet实现服务器端向客户端推送消息总结

    Pushlet 是一种基于 Java 的实时通信框架,用于实现在服务器端向客户端主动推送消息的功能,而无需客户端不断轮询。这种技术在构建实时应用程序,如聊天室、实时股票更新或在线游戏等场景中非常有用。以下是关于 ...

    基于pushlet实现的jsp网站消息推送

    Pushlet是基于Servlet和JSP技术的,它实现了服务器端向客户端主动推送数据的功能,无需客户端不断轮询服务器来获取新信息。Pushlet的核心概念是“连接会话”,通过保持一个持久的HTTP连接,服务器可以在有新数据时...

    使用Pushlet来实现服务器端向客户端推送信息

    使用Pushlet来实现服务器端向客户端推送信息

    pushlet定时向前台推送消息

    总之,“pushlet定时向前台推送消息”是一个利用Pushlet技术实现的服务器主动推送系统,它通过定时任务产生或更新数据,并通过长连接或WebSocket将这些数据实时推送到前端客户端,从而提供更高效、实时的用户体验。...

    pushlet java 消息实时推送

    Pushlet Java 消息实时推送是一个典型的技术实现,它允许服务端主动向客户端发送数据,无需客户端持续轮询,极大地提高了效率和用户体验。在这个简单的消息推送实例中,特别强调了解决中文错误问题,这意味着它已经...

    pushlet实现简单的用户聊天

    在IT行业中,Pushlet是一种基于Java的推送技术,主要用于实现实时的数据传输,尤其是在Web应用中创建实时聊天、通知服务等功能。Pushlet是基于HTTP连接持久化的概念,它允许服务器主动向客户端推送数据,而无需...

    服务器推送pushlet讲解

    服务器推送技术在现代Web...总之,Pushlet作为Comet的一种实现,提供了高效且灵活的服务器推送功能,尤其适合需要实时数据交互的Web应用。通过对Pushlet框架的深入理解和实践,开发者可以构建出更具互动性的Web服务。

    pushlet实例(java服务端推送消息)

    实现多个客户端连接到web服务器,由服务端推送消息至客户端(或指定id的客户端),代码中没有用官网的jar文件,而是用的源码,做了一定的修改,实现了每个客户端都可以自定义id,然后服务端可以向指定id客户端推送消息...

    一个基于pushlet推送的小例子

    Pushlet的核心思想是创建一个持久的HTTP连接,服务器端可以通过这个连接主动向客户端推送数据,而客户端只需要一次连接即可接收多次推送的数据,提高了效率和用户体验。 【Comet技术】 Comet是Web开发中用于实现...

    pushlet消息推送

    Pushlet是一种基于HTTP长连接的消息推送技术,最初由Jakarta项目开发,主要用于实现实时的、双向的Web通信。在传统的HTTP请求-响应模型中,客户端必须主动发起请求才能获取服务器端的数据,而Pushlet则打破了这种...

    PushLet实例,服务器消息推送

    【描述】"PushLet实例,实现服务器消息推送,完整实例,导入myeclipse 即可"意味着这个压缩包提供了一个完整的PushLet项目实例,用户只需将其导入到MyEclipse集成开发环境中,即可进行编译、运行和学习。MyEclipse是...

    Pushlet消息推送

    2. **按需广角推送**:当服务器端有新的信息需要广播给所有在线用户时,就会使用这种推送方式。例如,在社交媒体平台中,如果有一个热门话题,服务器可以立即把这个信息推送给所有关注该话题的用户。 3. **点对点推...

    pushlet2.0.4-demo-增加指定人推送

    总结来说,Pushlet 2.0.4 的指定用户推送功能是其在实时消息领域的一大进步,它不仅提高了消息传递的效率,还增强了系统的灵活性和可扩展性。对于开发人员来说,掌握这一特性,能够更好地满足用户对实时交互的需求,...

    通过推送机制(Tomcat comet,pushlet)实现进度条

    标题中的“通过推送机制(Tomcat comet,pushlet)实现进度条”涉及到的是Web应用中的一种实时通信技术,主要用于提供动态更新和用户交互。这里主要介绍Tomcat的Comet和Pushlet技术,以及如何利用它们来创建一个...

    Pushlet后台往jsp前台推送消息实例

    总的来说,Pushlet提供了一种简单的方式来实现在Web应用中从后台向前端推送消息,这对于实时聊天、股票更新、在线游戏等场景非常有用。通过理解Pushlet的工作原理和实践操作,开发者可以有效地提升Web应用的交互体验...

    网页推送pushlet的demo

    网页推送技术在现代互联网应用中扮演着重要角色,它能够实时地将服务器端的数据更新推送到客户端,无需用户频繁刷新页面。Pushlet是基于Java的一种早期的推送技术框架,它利用了 comet 技术,实现了服务器到客户端的...

    服务器推送 pushlet

    Pushlet是一个服务器推送框架的实例,它提供了一种实现服务器到客户端数据推送的方法。 Pushlet的核心概念是基于HTTP长连接的 Comet 模式。Comet模式通过长时间保持一个HTTP连接开放,使得服务器可以在适当的时候向...

    Pushlet服务向

    Pushlet服务是一种基于JavaWeb的实时数据推送技术,它允许服务器主动地将信息推送给客户端,而不仅仅是响应客户端的请求。在Web应用中,Pushlet服务通常用于实现数据的即时更新,比如股票报价、聊天室消息、在线游戏...

    pushlet_向在线的特定用户发送消息的单线程应用

    在“pushlet_向在线的特定用户发送消息的单线程应用”中,我们关注的是如何使用Pushlet来实现对特定在线用户的即时消息推送,并且整个应用是基于单线程设计的。 首先,我们需要理解单线程的含义。在多用户环境中,...

    pushlet服务器推技术例子

    【Pushlet服务器推技术】是一种实时通信技术,主要用于构建能够实时推送信息的Web应用程序,比如聊天、股票更新、在线游戏等场景。Pushlet是基于Java的开源项目,它利用了HTTP的长连接特性,实现了服务器主动向...

Global site tag (gtag.js) - Google Analytics