`
ganqing1234
  • 浏览: 171250 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

pushlet 学习二

阅读更多

 

pushlet 的官网上有很多例子,可以参见http://www.pushlets.com/pushlet/examples/pushlet.html ,其中有个webim的例子,这个其实是个聊天室的功能,如果改为点对点的聊天方式的话怎么做呢?

 

大体上有两种方式:

一 修改客户端js,拿到消息后判断接受者标示和当前用户是否一致,不一致则不显示。

二 是修改pushlet源码,仔细查看源码可以知道,在SessionManager.java 里面 createSession 方法,是以随机数生成session id的,一个随机数的session id显然无法满足精确查找的要求,我们需要改写这段代码,例如我就将session id改为登录用户的loginName,loginName以url的参数形式传递过来,将原来的方法改为:

 

/**
   * Create new Session (but add later).
   */
public Session createSession(Event anEvent) throws PushletException {
    // Trivial
    //return Session.create(createSessionId()); 原先的代码,生成随机数的session id
    return Session.create(anEvent.getField("uid"));
}
 

再查看 Controller.java 中的doPublish方法

 

protected void doPublish(Command aCommand) {
		Event responseEvent = null;

		try {
			String subject = aCommand.reqEvent.getField(Protocol.P_SUBJECT);
			if (subject == null) {
				// Return error response
				responseEvent = new Event(E_NACK);
				responseEvent.setField(P_ID, session.getId());
				responseEvent.setField(P_REASON, "no subject provided");
			} else {
				aCommand.reqEvent.setField(P_FROM, session.getId());
				aCommand.reqEvent.setField(P_EVENT, E_DATA);

				// Event may be targeted to specific user (p_to field)
				String to = aCommand.reqEvent.getField(P_TO);
				if (to != null) {
					Dispatcher.getInstance().unicast(aCommand.reqEvent, to);
				} else {
					// No to: multicast
					debug("doPublish() event=" + aCommand.reqEvent);
					Dispatcher.getInstance().multicast(aCommand.reqEvent);
				}

				// Acknowledge
				responseEvent = new Event(E_PUBLISH_ACK);
			}

		} catch (Throwable t) {
			responseEvent = new Event(E_NACK);
			responseEvent.setField(P_ID, session.getId());
			responseEvent.setField(P_REASON, "unexpected error: " + t);
			warn("doPublish() error: " + t);
			t.printStackTrace();
		} finally {
			// Always set response event in command
			aCommand.setResponseEvent(responseEvent);
		}
	}
 

其中的

String to = aCommand.reqEvent.getField(P_TO);
if (to != null) {
    Dispatcher.getInstance().unicast(aCommand.reqEvent, to);
}

表明只要在发送消息的时候指定要发送的人(session id)就会单独发送给那个人,而不会以广播形式发送。

 

这样只需修改pushlet的 session id的生成方式,在发送消息是指定接收者的session id 即可实现消息的定点发送。

分享到:
评论
7 楼 恶魔眼睛 2013-08-04  
经常出现:
WARN | S-0:0:0:0:0:0:0:1[kicewaqoqa]: [Subscriber] not alive for at least: 45000ms, leaving...
INFO | SessionManager: Sun Aug 04 16:06:16 CST 2013 kicewaqoqa at 0:0:0:0:0:0:0:1 removed
是什么问题。把回调方法去掉就没有这个问题。。奇怪
6 楼 gaboolic 2013-07-14  
ganqing1234 写道
zhangyao 写道
return Session.create(anEvent.getField("uid")); 

是指我们在JS里发布登录的时候,将UID传进去吗?
PL.publish(‘login’,'name='+name+'&'+'msg='+msg+'&'+'userId='+user.getId());

这样的方式?

应该是的 好久没有碰这个了,不记得了



看源码是每次publish都会重新get一次请求
在servlet里每次把所有参数放到Event
所以每次PL.publish 要把uid和p_to  都写进去
5 楼 gaboolic 2013-07-14  
zhangyao 写道
return Session.create(anEvent.getField("uid")); 

是指我们在JS里发布登录的时候,将UID传进去吗?
PL.publish(‘login’,'name='+name+'&'+'msg='+msg+'&'+'userId='+user.getId());

这样的方式?


看了半天源码,是把p_to传进去  p_to是session id
4 楼 ganqing1234 2012-11-29  
zhangyao 写道
return Session.create(anEvent.getField("uid")); 

是指我们在JS里发布登录的时候,将UID传进去吗?
PL.publish(‘login’,'name='+name+'&'+'msg='+msg+'&'+'userId='+user.getId());

这样的方式?

应该是的 好久没有碰这个了,不记得了
3 楼 zhangyao 2012-10-31  
return Session.create(anEvent.getField("uid")); 

是指我们在JS里发布登录的时候,将UID传进去吗?
PL.publish(‘login’,'name='+name+'&'+'msg='+msg+'&'+'userId='+user.getId());

这样的方式?
2 楼 ganqing1234 2010-11-08  
pushlet 提供的js里有方法的,如:
p_publish('/chat', 'action', 'enter', 'nick', ALERT_MSG.nick, 'nickName', escape(ALERT_MSG.nickName));

用escape转下就好
1 楼 Tomzheng 2010-11-04  
js怎么传参数过去?好多特殊符号要处理.受不了.

相关推荐

    Pushlet学习(二) -- Pushlet CookBook部分翻译 + 注释

    本篇内容主要围绕"Pushlet学习(二) -- Pushlet CookBook部分翻译 + 注释"进行展开,将对Pushlet的工作原理、核心组件以及如何使用Pushlet进行编程进行深入讲解。 1. Pushlet简介: Pushlet是基于HTTP的 Comet 模式...

    pushlet实现简单的用户聊天

    在IT行业中,Pushlet是一种基于Java的推送技术,主要用于实现实时的数据传输,尤其是在Web应用中创建...通过学习和实践"pushlet实现简单的用户聊天",开发者可以掌握这种技术,并将其应用于各种复杂的实时交互应用中。

    pushlet服务器推技术例子

    【Pushlet服务器推技术】是一种实时通信技术,主要用于构建...在压缩包文件“pushlet”中,可能包含了实现Pushlet技术的源代码、配置文件和示例应用,供开发者学习和参考,以便在自己的项目中集成和使用Pushlet服务。

    PushLet实例,可直接运行

    2. **配置文件**:如XML配置文件,可能包含了PushLet服务器的配置信息,例如端口号、安全设置等。 3. **库文件**:jar包,包含了PushLet框架和其他依赖的第三方库,比如可能包含Jetty(一个轻量级的HTTP服务器和...

    PUSHLET即时通讯工程实例

    2. **css**:存放CSS样式文件,用于定义页面的布局和视觉效果。 3. **homepage**:可能包含首页或引导页的资源文件。 4. **images**:存储项目中使用的图像资源。 5. **META-INF**:包含项目的元数据,如MANIFEST...

    pushlet框架做的小例子

    通过这个小例子,你可以直观地了解Pushlet框架的工作流程,并学习如何在自己的项目中集成和使用Pushlet。 **总结** Pushlet框架为Java开发者提供了一种实现服务器到客户端实时数据推送的有效工具,通过克服HTTP的...

    Pushlet点对点发送消息

    通过上述知识点的学习和实践,你可以掌握如何使用Pushlet实现高效的点对点消息传递,这对于开发实时协作工具、在线游戏、聊天应用或者任何需要实时数据更新的系统都非常有用。在提供的"mypushlet"文件中,可能包含了...

    pushlet的JAR包和文档

    2. **Pushlet白皮书**:这是一份关于Pushlet的详细介绍文档,可能涵盖了其设计原则、工作原理、使用方法以及优点等内容。白皮书分为英文版和中文版,方便不同语言背景的读者理解。 3. **源码分析**:"pushlet 2.0.3...

    pushlet-UserUnicast

    2. **Pushlet框架**:深入研究Pushlet框架的架构和工作流程,了解它如何处理连接、订阅和发布事件,以及如何支持多线程和并发。 3. **Java编程**:由于Pushlet是用Java编写的,因此掌握基本的Java语法和面向对象...

    pushlet简单demo,导入即可运行

    通过研究和运行这个demo,开发者可以学习到如何在Java环境中实现服务器推送,理解长连接的工作原理,以及如何处理轮询和非轮询的推送策略。这对于开发实时Web应用,特别是那些需要即时数据更新的场景,是非常有价值...

    网页推送pushlet的demo

    通过这个Demo,你可以学习到Pushlet的基本用法,理解服务器推送的实现机制,并为自己的实时Web应用打下基础。然而,Pushlet是较早的推送技术,现在已经有更多先进的解决方案,如WebSocket、Server-Sent Events (SSE)...

    pushlet定时向页面发送消息demo

    通过学习和运行这个示例,你可以更好地理解Pushlet的工作机制,并能将其应用于自己的项目中,实现服务器定时向页面推送消息的功能。在实际使用时,还可以根据需求进行定制和优化,例如,添加错误处理和日志记录,...

    服务器推送——PushLet的应用<一>

    【服务器推送技术——PushLet应用详解&lt;一&gt;】 在当今的互联网应用中,实时性成为了不可或缺的需求,...通过学习和应用PushLet,开发者可以快速构建出具有实时功能的Web应用,提升用户体验,满足现代互联网应用的需求。

    pushlet的笔记

    - **Pushlet CookBook**:《Pushlet学习(二) -- Pushlet CookBook部分翻译 + 注释.htm》可能是对Pushlet使用手册的中文译文,包含了一些基础用法和实例,注释提供了更直观的理解,帮助开发者快速上手。 3. **发布...

    一个基于pushlet推送的小例子

    【推送技术】 推送技术是Web开发中的一种高级机制,它允许服务器主动向...通过这个例子,开发者可以学习到如何构建和部署一个能够进行服务器端数据推送的Web应用,这对于需要实时交互的系统设计具有重要参考价值。

    pushlet-2.0.4.rar

    通过学习和运行示例,可以掌握如何创建推送订阅、发布消息、以及如何在J2ME和JAVA WEB环境中集成Pushlet。 六、社区支持与文档 作为一个开源项目,Pushlet拥有活跃的开发者社区,提供了详细的文档和示例,用户可以...

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

    标题中的“pushlet”是指Pushlet,一种基于Comet技术的服务器推送机制。...在“pushlet_向在线的特定...通过研究提供的源码和工具,开发者可以学习如何构建一个简单的实时消息推送系统,特别是针对特定在线用户的推送。

    pushlet聊天工具编辑中。。。。

    "Pushlet聊天工具"是一个基于特定技术实现的通信软件,主要功能是提供实时的信息传递服务。根据提供的标签“源码”和“工具”,我们可以推断这个压缩包可能包含了一个聊天工具的源代码,用于帮助开发者理解和学习...

    服务器推送 pushlet

    2. **保持连接**:Pushlet Server接收到请求后,不会立即返回响应,而是保持连接打开状态,等待服务器端有新的数据准备推送。 3. **数据推送**:当服务器端有新数据可用时,Pushlet Server会将数据封装成HTTP响应,...

    Pushlet简单应用小结

    【Pushlet简单应用小结】 Pushlet是一种基于Java的实时数据推送技术,它允许服务器主动向客户端推送数据,而不需要...通过学习Pushlet,开发者可以更好地掌握服务器推送的概念,为构建高效的实时Web应用打下基础。

Global site tag (gtag.js) - Google Analytics