服务器推技术之Pushlets的使用 二
令狐昂雄
2023-12-01
Pushlet 是一个开源的 Comet 框架,在设计上有很多值得借鉴的地方,对于开发轻量级的 Comet 应用很有参考价值。 Pushlets的下载地址是 http://www.pushlets.com Pushlet 使用了观察者模型:客户端发送请求,订阅感兴趣的事件;服务器端为每个客户端分配一个会话 ID 作为标记,事件源会把新产生的事件以多播的方式发送到订阅者的事件队列里。 Pushlet支持ajax,flash,applet等多种形式客户端,其中以ajax的客户端集成相对简单。这里就不在介绍。详细参看实例里面stock部分。 这里只是简单介绍如何创建基于FLASH客户端的使用。 首先创造服务器端程序: 并将pushlet.jar引入到工程,将 pushlet.properties sources.properties 拷贝到/WEB-INFO/classes目录下,并在sources.properties中填写如下语句 source8=CometDemo.cn.CometDemoPull$CometRatePull 然后创建java文件如下: -----------------------------------------------CometDemoPull.java package CometDemo.cn; import nl.justobjects.pushlet.core.Event; import nl.justobjects.pushlet.core.EventPullSource; import nl.justobjects.pushlet.util.Rand; public class CometDemoPull { static public class CometRatePull extends EventPullSource{ @Override protected long getSleepTime() { return 3000L; //这里是设置了一个轮回的时间间隔 } @Override protected Event pullEvent() { Event event = Event.createDataEvent("/CometDemo/TestRate"); //这里创建一个服务。 event.setField("JPY",Rand.randomInt(1, 100)); //以下是发送到客户端的数据 event.setField("GBR",Rand.randomInt(1, 100)); event.setField("RMB",Rand.randomInt(1, 100)); event.setField("USD",Rand.randomInt(1, 100)); return event; } } } ---------------------------------------------------------------------------------- 在web.xml中添加如下servlet影射: <!-- Define the 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> =================================以上服务器端完成。 然后是flash客户端 这里我们原来pushlet的flash例子基础之上进行修改。原来的例子没有发送数据只是保持和服务器连接。这里将他修改为接受自定义数据的flash客户端 代码修改如下: ------------------------------------------------------------flash function display(text) { panel = panel+text+newline; panel.scroll = panel.maxscroll; } function displayEvent(xmlObject) { attributes = xmlObject.attributes; for (var j in attributes) { text = text + " " + j + "=" + attributes[j]; } display(text); } var eventXML; var intervalID; var sessionID; var host = "http://localhost:8080/CometDemo"; var path = "/pushlet.srv?p_event=join-listen&p_subject=/CometDemo/TestRate&p_format=xml-strict&p_mode=pull"; var refreshPath="/pushlet.srv?p_event=refresh&p_id=" loadXML(host, path); function loadXML(host, path) { url = host + path; eventXML = new XML(); eventXML.ignoreWhite = true; eventXML.onLoad = myLoad; eventXML.load(url); clearInterval(intervalID); } function myLoad(ok) { if (ok == true) { handleEvents(eventXML); } else { display("Error receiving event"); } } function handleEvents(xmlObject) { var children = xmlObject.firstChild.childNodes; for (i=0; i