转自: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> |
步骤三: 配置文件( 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 是一种基于 Java 的实时通信框架,用于实现在服务器端向客户端主动推送消息的功能,而无需客户端不断轮询。这种技术在构建实时应用程序,如聊天室、实时股票更新或在线游戏等场景中非常有用。以下是关于 ...
Pushlet是基于Servlet和JSP技术的,它实现了服务器端向客户端主动推送数据的功能,无需客户端不断轮询服务器来获取新信息。Pushlet的核心概念是“连接会话”,通过保持一个持久的HTTP连接,服务器可以在有新数据时...
使用Pushlet来实现服务器端向客户端推送信息
总之,“pushlet定时向前台推送消息”是一个利用Pushlet技术实现的服务器主动推送系统,它通过定时任务产生或更新数据,并通过长连接或WebSocket将这些数据实时推送到前端客户端,从而提供更高效、实时的用户体验。...
Pushlet Java 消息实时推送是一个典型的技术实现,它允许服务端主动向客户端发送数据,无需客户端持续轮询,极大地提高了效率和用户体验。在这个简单的消息推送实例中,特别强调了解决中文错误问题,这意味着它已经...
在IT行业中,Pushlet是一种基于Java的推送技术,主要用于实现实时的数据传输,尤其是在Web应用中创建实时聊天、通知服务等功能。Pushlet是基于HTTP连接持久化的概念,它允许服务器主动向客户端推送数据,而无需...
服务器推送技术在现代Web...总之,Pushlet作为Comet的一种实现,提供了高效且灵活的服务器推送功能,尤其适合需要实时数据交互的Web应用。通过对Pushlet框架的深入理解和实践,开发者可以构建出更具互动性的Web服务。
实现多个客户端连接到web服务器,由服务端推送消息至客户端(或指定id的客户端),代码中没有用官网的jar文件,而是用的源码,做了一定的修改,实现了每个客户端都可以自定义id,然后服务端可以向指定id客户端推送消息...
Pushlet的核心思想是创建一个持久的HTTP连接,服务器端可以通过这个连接主动向客户端推送数据,而客户端只需要一次连接即可接收多次推送的数据,提高了效率和用户体验。 【Comet技术】 Comet是Web开发中用于实现...
Pushlet是一种基于HTTP长连接的消息推送技术,最初由Jakarta项目开发,主要用于实现实时的、双向的Web通信。在传统的HTTP请求-响应模型中,客户端必须主动发起请求才能获取服务器端的数据,而Pushlet则打破了这种...
【描述】"PushLet实例,实现服务器消息推送,完整实例,导入myeclipse 即可"意味着这个压缩包提供了一个完整的PushLet项目实例,用户只需将其导入到MyEclipse集成开发环境中,即可进行编译、运行和学习。MyEclipse是...
2. **按需广角推送**:当服务器端有新的信息需要广播给所有在线用户时,就会使用这种推送方式。例如,在社交媒体平台中,如果有一个热门话题,服务器可以立即把这个信息推送给所有关注该话题的用户。 3. **点对点推...
总结来说,Pushlet 2.0.4 的指定用户推送功能是其在实时消息领域的一大进步,它不仅提高了消息传递的效率,还增强了系统的灵活性和可扩展性。对于开发人员来说,掌握这一特性,能够更好地满足用户对实时交互的需求,...
标题中的“通过推送机制(Tomcat comet,pushlet)实现进度条”涉及到的是Web应用中的一种实时通信技术,主要用于提供动态更新和用户交互。这里主要介绍Tomcat的Comet和Pushlet技术,以及如何利用它们来创建一个...
总的来说,Pushlet提供了一种简单的方式来实现在Web应用中从后台向前端推送消息,这对于实时聊天、股票更新、在线游戏等场景非常有用。通过理解Pushlet的工作原理和实践操作,开发者可以有效地提升Web应用的交互体验...
网页推送技术在现代互联网应用中扮演着重要角色,它能够实时地将服务器端的数据更新推送到客户端,无需用户频繁刷新页面。Pushlet是基于Java的一种早期的推送技术框架,它利用了 comet 技术,实现了服务器到客户端的...
Pushlet是一个服务器推送框架的实例,它提供了一种实现服务器到客户端数据推送的方法。 Pushlet的核心概念是基于HTTP长连接的 Comet 模式。Comet模式通过长时间保持一个HTTP连接开放,使得服务器可以在适当的时候向...
Pushlet服务是一种基于JavaWeb的实时数据推送技术,它允许服务器主动地将信息推送给客户端,而不仅仅是响应客户端的请求。在Web应用中,Pushlet服务通常用于实现数据的即时更新,比如股票报价、聊天室消息、在线游戏...
在“pushlet_向在线的特定用户发送消息的单线程应用”中,我们关注的是如何使用Pushlet来实现对特定在线用户的即时消息推送,并且整个应用是基于单线程设计的。 首先,我们需要理解单线程的含义。在多用户环境中,...
【Pushlet服务器推技术】是一种实时通信技术,主要用于构建能够实时推送信息的Web应用程序,比如聊天、股票更新、在线游戏等场景。Pushlet是基于Java的开源项目,它利用了HTTP的长连接特性,实现了服务器主动向...