`
yjdingkai
  • 浏览: 18658 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用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 version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<servlet>
	   <servlet-name>pushlet</servlet-name>
	   <servlet-class>nl.justobjects.pushlet.servlet.Pushlet</servlet-class>
	   <load-on-startup>3</load-on-startup>
	</servlet>
	<servlet> 
    <servlet-name>FirePush</servlet-name>
  		<servlet-class>com.mysrc.FirePush</servlet-class>
    </servlet>	
	<servlet-mapping>
	   <servlet-name>pushlet</servlet-name>
	   <url-pattern>/pushlet.srv</url-pattern>
	</servlet-mapping>	
	<servlet-mapping>
  	   <servlet-name>FirePush</servlet-name>
  	   <url-pattern>/FirePush</url-pattern>
    </servlet-mapping>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 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;这一行,这儿就是在构造请求参数,在它的后面加入代码:

 
if (anEvent == 'join' || anEvent == 'join-listen') { 	url = url + '&userId=' + PL.userId; 
		}

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

接下来是test.html:

  

<html>
  <head>
  <script type="text/javascript" src="ajax-pushlet-client.js"></script> 
  <script type="text/javascript">  
  		 PL.userId='piero';
         PL._init();  
         PL.joinListen('myevent1'); 
         function onData(event) { 
            alert(event.get("key1"));  
         }
  </script> 
  </head>
  <body>
    This is pushlet test page....<br>
  </body>
</html>

然后就是修改pushlet的java源代码,找到nl.justobjects.pushlet.core包下的SessionManager类,将它的createSession方法改成:  

public Session createSession(Event anEvent) throws PushletException {
		// Trivial
		//return Session.create(createSessionId());
		return Session.create(anEvent.getField("userId", "visitor"));
	}

 这儿就使得建立的session的id是发送过来的userId,而不是一个随机字符串。getField的第二个参数是当得不到请求参数userId的值的时候设定的默认值。

好了,所有的准备工作都完成了,接下来就是通过userId给特点的用户推送信息了。

FirePush.java代码如下:

package com.mysrc;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import nl.justobjects.pushlet.core.Dispatcher;
import nl.justobjects.pushlet.core.Event;
import nl.justobjects.pushlet.core.SessionManager;

public class FirePush extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		myUnicast();
		//myMulticast();
		//myBroadcast();
	}
    private void myUnicast()
    {
    	if(SessionManager.getInstance().hasSession("piero")){
    		Event  event = Event.createDataEvent("myevent1"); 
			event.setField("key1", "houhou_yesttttt....");  		
			Dispatcher.getInstance().unicast(event,"piero"); //向ID为piero的用户推送
			  
			System.out.println("success....");
    	}
    	else {
    		System.out.println("piero do not login....%%%%%%%%%%%%");
    	}
    }
    private void myMulticast()
    {
    	Event  event = Event.createDataEvent("myevent1"); 
		event.setField("key1", "houhou....");  
		Dispatcher.getInstance().multicast(event);  //向所有和myevent1名称匹配的事件推送
		
		System.out.println("wa success....");
    }
    private void myBroadcast()
    {
    	Event  event = Event.createDataEvent("myevent1"); //向所有的事件推送,不要求和这儿的myevent1名称匹配
		event.setField("key1", "dig hole....");    
		Dispatcher.getInstance().broadcast(event);
		
		System.out.println("asw success....");
    }
}

 这儿主要利用了dispatcher的unicat/multicat/broadcast方法。

好了,值得一提的是在ajax-pushlet-client.js有publish方法,也就是上面提到的触发信息推送动作,其实完全可以在前端调用这个js的publish函数向订阅了某事件的所有网页推送信息。test2.html代码如下: 

<html>
  <head>
  <script type="text/javascript" src="ajax-pushlet-client.js"></script> 
  <script type="text/javascript"> 
  		 PL.userId='juvenh';
         PL._init(); 
              
         PL.joinListen('event223'); 
         function onData(event) { 
               alert(event.get("eventVal"));  
         }
         
         function sendnews(){ 
 			//PL.publish("myevent1","key1=dlut&ba=ls"); 
 			p_publish('myevent1', 'key1', 'dlut', 'ba', 'ls');
		}
  </script> 
  </head>
  
  <body>
    This is my JSP page. <br>
    <input type = "button" value="发消息" onclick="sendnews()"/> 
  </body>
</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。

 

分享到:
评论
3 楼 冻未条 2013-03-21  
找了很多很多很多的资料,就LZ这篇写得明白,让我这个菜鸟恍然大悟,赞一个,纠结了N久都不知怎么利用pushlet实现web聊天,到时有问题希望还能请教。
2 楼 bushkarl 2012-12-27  
总感觉这种方式不好,把userId写死,我如果想想实现类似web qq的点对点聊天就无法做到。
1 楼 nsh95958 2012-06-20  
额。。。我照这个代码写了遍,可是为什么sessionManager检测不到连接呢?是不是少写了什么?

相关推荐

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

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

    pushlet定时向前台推送消息

    Pushlet是一种基于Java的技术,用于实现服务器向客户端的实时数据推送。这种技术的核心思想是打破传统的HTTP请求-响应模式,让服务器能够在数据更新时主动将信息推送给客户端,而不是等待客户端发起新的请求来获取...

    pushlet java 消息实时推送

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

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

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

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

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

    服务器推送pushlet讲解

    Pushlet是基于Comet技术的一种实现,它为Java开发者提供了一种高效的服务器推送解决方案。 一、Comet技术 Comet是一种允许服务器长时间保持HTTP连接的技术,它打破了传统的Web应用模型,即客户端发起请求,服务器...

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

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

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

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

    一个基于pushlet推送的小例子

    总结来说,"一个基于pushlet推送的小例子"是一个展示如何在Tomcat服务器上利用Pushlet框架实现Comet技术的实例。通过这个例子,开发者可以学习到如何构建和部署一个能够进行服务器端数据推送的Web应用,这对于需要...

    pushlet消息推送

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

    Pushlet消息推送

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

    使用Ext Pushlet 实现的点对点聊天功能

    前台使用Ext ,后台使用pushlet /pushlet/WebRoot/index.jsp 页面主要包含几个部分。 Ext.PUSHLET_URL='piccUtil'; // 发送消息的地址 Ext.fcontent='fcontent'; // 显示窗口或有新消息时, 显示好友ID的区域 ...

    http长连接(服务器推)使用pushlet教程示例以及jar包源码

    "使用Pushlet实现点对点发送.docx"和"使用Pushlet实现一对多的信息推送.docx"则分别介绍了这两种推送模式的实现方法。 通过深入研究这些文档和源码,你可以了解到Pushlet是如何在底层利用HTTP长连接来实现实时通信...

    服务器推送 pushlet

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

    网页推送pushlet的demo

    Pushlet是基于Java的一种早期的推送技术框架,它利用了 comet 技术,实现了服务器到客户端的双向通信。在本Demo中,我们将深入探讨Pushlet的工作原理和如何实现一个基本的网页推送系统。 首先,我们需要理解什么是...

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

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

    PushLet实例,服务器消息推送

    【标题】"PushLet实例,服务器消息推送"指的是一个基于Java技术实现的服务器端消息推送系统,名为PushLet。在互联网应用中,实时性是非常重要的一个特性,例如在线聊天、股票更新、新闻推送等场景。传统的HTTP协议是...

    pushlet实现简单的用户聊天

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

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

    为了更好地理解和使用 Pushlet 2.0.4 的指定用户推送功能,你可以参考提供的"pushlet-2.0.4实例增加指定用户推送"压缩包文件。这个实例包含了源代码、配置文件和相关文档,可以帮助你快速搭建一个简单的示例应用,...

    使用Ext Pushlet 实现的点对点聊天功能最新

    前台使用Ext ,后台使用pushlet /pushlet/WebRoot/index.jsp 页面主要包含几个部分。 Ext.PUSHLET_URL='piccUtil'; // 发送消息的地址 Ext.fcontent='fcontent'; // 显示窗口或有新消息时, 显示好友ID的区域 ...

Global site tag (gtag.js) - Google Analytics