pushlet

我的第一个pushlet例子-hello world
2011-01-18 11:27

pushlet是comet的一个实现框架,在Servlet机制下,数据从server端的java对象直接推送(push)到html页面,无需插件的支持。至于comet和ajax的区别什么的,大家上网看一下即可,这里不做太多说明。

首先去下载pushlet,下载地址:http://www.pushlets.com/,我下载的是一个当下最新的版本2.0.4。下面以一个例子做下说明,详细的可以看一下pushlet自身带的例子,源码也不是很复杂,包括几个js文件。有空大家看看源码可能更好些。

首先建立一个web工程projPushlet,将pushlet.jar放到lib目录中,引入到工程。并且将pushlet.propertiessources.properties两个文件拷贝到WEB-INF目录中去。工程的目录结构如图示


我们一般只需要对sources.properties进行修改即可。创建的消息源必须在这个文件中进行配置。消息源需要实现EventSource接口

先看一下web.xml文件的servlet配置

1   <?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>1</load-on-startup

11      </servlet

12   

13      <!-- Define the Servlet Mappings. --> 

14   

15      <!-- The pushlet --> 

16      <servlet-mapping

17          <servlet-name>pushlet</servlet-name

18          <url-pattern>/pushlet.srv</url-pattern

19      </servlet-mapping>  

20  </web-app

 注意,缺省不需要修改<url-pattern>/pushlet.srv</url-pattern>,如果修改,需要在对应的js文件中也要修改。pushlt缺省就是通过pushlet.srv触发servlet的。

==========================================

看一下index.jsp这个文件的内容

1    <%@ pagecontentType="text/html;charset=UTF-8language="java" %> 

2    <html> 

3    <head> 

4        <script type="text/javascript" src="ajax-pushlet-client.js"></script> 

5        <script type="text/javascript"> 

6            PL._init(); 

7            PL.joinListen('/zhaoyang/hi'); 

8            function onData(event) { 

9                alert(event.get("hw")); 

10           } 

11       </script> 

12   </head> 

13    

14   <body> 

15   <h1>my first pushlet</h1> 

16   </body> 

17   </html> 

其中,第6行,是对pushlet的初始化,触发web.xml中的servlet。其中,第七行特别重要,这里的监听的主题,必须在sources.properties中配置的对象中声明这个主题。sources.properties配置着事件源(EventSources),在服务器启动时会自动激活。可以通过服务器的启动记录查看的到。可以将这个文件放到WEB-INF目录下面或者classess目录下面都可以。(详细可以看sources.properties内的注释)

然后看一下sources.properties这个文件内容。如下图示:

注意,source1是系统缺省自带的,source2是我自己配置的,并且在index.jsp中的脚本中,配置的/zhaoyang/hi是和这儿是对应的。具体是这样的。HwPlushlet是com.css.HelloWorldPlushlet对象的一个内部类,并且继承EventPullSource接口。大家看一下HelloWorldPlushlet.java就全明白了。代码如下:

1   package com.css;
2     

3   import nl.justobjects.pushlet.core.Event;
4    
import nl.justobjects.pushlet.core.EventPullSource;
5     
6    
import java.io.Serializable;
7     
8    
/**
9     *Created by IntelliJ IDEA.
10    * User:liuzhy
11    * Date: 2011-1-18
12    * Time:10:54:35
13    */
14   
publicclass HelloWorldPlushlet implements Serializable{
15       
static public class HwPlushlet extends EventPullSource {
16    
17           @Override
18           
protected long getSleepTime() {
19               
return 1000;   
20           }
21    
22           @Override
23           
protected Event pullEvent() {
24               Event event =Event.createDataEvent(
"/zhaoyang/hi");
25               event.setField(
"hw","hello,world");
26               
return event;  
27           }
28       }
29   }
30   

在上面的代码中,可以看到创建事件(createDataEvent)的主题(aSubject)是
/zhaoyang/hi,和index.jsp中PL.joinListen('/zhaoyang/hi'); 是对应的。EventPullSource有两个方法,一个是设置休眠时间(getSleepTime),另一个是创建事件(pullEvent)。其中,业务部分就写在pullEvent()方法中即可,这个方法会被定时调用

这样这个基本的例子就OK了,运行一下,看看吧。

 访问http://localhost:8080/ 会定时弹出alert窗口,窗口的内容就是 event.setField("hw","hello,world");,呵呵。如图:

如果这个页面关闭了,服务器会自动取消订阅,和移除对应的session信息。下面是我关闭页面后,服务器端的输出信息,如图:


-----------------------------------------------

这里,因为我没有对pushlet的原理进行说明,主要是写了一个例子,如果要了解原理,可以上网Google一下,原理方面的资料很多,但是实际的例子确很少,呵呵。




push模式的实现过吗?继承EventSource而不是定时发送
如果实现过请联系1988clong@sina.com,我推出消息客户端不知道如何接受

 
2 2011-03-04 09:45 | 回复
我的这个 HwPlushlet(内部类)实现是继承 EventPullSource ,不知道咱们说的是不是一会儿事,呵呵。希望这个例子对你有所帮助
 
3 2011-04-06 14:02 | 回复
唉,看了这个例子,服务器定时推送跟客户端定时拉,效果没有啥不一样啊
 
4 2011-04-11 21:39 | 回复
这不还是定时刷新么
 
5 2011-04-11 23:33 | 回复
回复Linear56:有所不同,这种只是服务器端定时刷新,然后将结果发给客户端。而不是很多个客户端刷新,都请求服务器。是想一下,一个服务器有10000个用户在线,每个客户端都每5秒请求服务器一次,每秒总的请求量是多大,而如果服务器每5秒执行一次,将结果发给客户端,孰优孰略就很明显了。
 
6 2011-04-18 14:24 | 回复
多谢楼主发出如此精辟实用的例子,看了你的HELLOWORLD 恍然大悟啊

服务器推 的技术 是非常给力的。。本人正在做一个类似web qq的东西 受益了 感谢!!
 
7 2011-04-19 16:44 | 回复
回复33loveyy:过誉了。呵呵
 
8 2011-04-21 15:17 | 回复
帅哥,我想知道那个ajax-pushlet-client.js 和 js-pushlet-client.js 有啥不一样?如果方便的话能不能加我QQ说一下这个pushlet呢。谢谢。
 
9 2011-04-23 17:21 | 回复
这个好像不能在IE6下正常运行。
我在ie6下运行,在网页的底部出现如下错误:
pushlet - server error:[pushlet] problem retrieving XML data: /webpushlet/nullpushlet.srv
 
webpushlet 是我项目名称;nullpushlet.srv 这个前面出现个null不知道什么原因;
但是我在苹果浏览器或google浏览器有能正常alert出来,没有报错。
 
 
10 2011-04-23 17:23 | 回复
还有就是,pushlet自带的那些列子却都能在 ie6 下面运行
 
11 2011-06-06 11:33 | 回复
讲解的很好很清楚,辛苦了。需要探讨的是,有没有可能服务器端也不是通过定时的方式,而是采用线程阻塞/唤醒的机制,比如没有消息过来时,服务器端就阻塞,而不是定时轮讯是否有消息?
 
12 2011-06-07 09:39 | 回复
回复happyrickylau:这个不是很清楚。
 
13 2011-06-10 18:46 | 回复
问楼主个问题,hello,world换成中文就不行了,为什么?谢谢
 
14 2011-06-10 18:50 | 回复
请留言给我,或者是其他方式,我在关注中
 
15 2011-06-13 19:46 | 回复
回复nyjavazhy:把jsp设置为utf-8,有问题?
 
16 2011-06-13 20:49 | 回复
是的
 
17 2011-06-25 18:55 | 回复
我这里有两个问题
1.我要从页面传入数据到pullEvent() 中如何实现,需要修改哪些源码
2.目前 event.setField如何支持数组,我在session中加入数组对象,通过event.setField进行set,但是一运行就会出现session被remove掉,如何解决?
 
18 2011-06-28 14:23 | 回复
怎么支持中文啊?
 
19 2011-07-25 18:07 | 回复
写的很好,我也想问问如何实现阻塞代替定时轮询
 
20 2011-08-04 23:29 | 回复
后台传的值是实时变化的怎么处理?
 
21 2011-08-19 10:39 | 回复
event.setField("hw", new String("你好!".getBytes("UTF-8"), "ISO-8859-1"));
 
22 2011-10-19 14:13 | 回复
好帖子,写的挺详细,谢谢楼主
 
23 2011-12-01 15:58 | 回复
看了源码~这个例子确实是客户端轮询,只是服务器还控制了下他什么时候在轮询一下罢了
 
24 2012-01-11 23:25 | 回复
idea,我很喜欢
 
25 2012-02-22 10:35 | 回复
按照楼主的例子做了一遍,发现在窗口关闭时Session管理器没有回收该客户端的资源!QQ:455213313
 
26 2012-04-23 15:24 | 回复
图片挂了 有点迷糊了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Pushlet 是一个开源的 Comet 框架,Pushlet 使用了观察者模式:客户端发送请求,订阅感兴趣的事件;服务器端为每个客户端分配一个会话 ID 作为标记,事件源会把新产生的事件以多播的方式发送到订阅者的事件队列里。 server端向浏览器client发送通知这种通讯模式在J2EE应用中很常见,通常使 Pushlet服务器端Java类UML图 Pushlet服务器端Java类UML图 用采用RMI、CORBA或者自定义TCP/IP信息的applet来实现。这些技术往往由于复杂而产生诸多不利之处:技术难以实现、存在防火墙限制(因为需要打开非HTTP的通讯端口)、需要额外的server开发和维护。并且除了刷新整个页面或者完全采用applet展示内容之外,很难找到别的方法将client端applet的状态和浏览器的页面内容集成在一起。 Pushlet是一种comet实现:在Servlet机制下,数据从server端的Java对象直接推送(push)到(动态)HTML页面,而无需任何Java applet或者插件的帮助。它使server端可以周期性地更新client的web页面,这与传统的request/response方式相悖。浏览器client为兼容JavaScript1.4版本以上的浏览器(如Internet Explorer、FireFox),并使用JavaScript/Dynamic HTML特性。而底层实现使用一个servlet通过Http连接到JavaScript所在的浏览器,并将数据推送到后者。有关JavaScript版本的知识请参看Mozilla开发中心提供的《JavaScript核心参考》和Stephen Chapman编写的《What Version of Javascript》。 这种机制是轻量级的,它使用server端的servlet连接管理、线程工具、javax.servlet API,并通过标准Java特性中Object的wait()和notify()实现的生产者/消费者机制。原则上,Pushlet框架能够运行在任何支持servletserver上、防火墙的后面。当在client中使用JavaScript/DHTML时,Pushlet提供了通过脚本快速建立应用、使用HTML/CSS特性集成和布局新内容的便利方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

福海鑫森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值