转自:http://hi.baidu.com/ryouaki/blog/item/b3772f230439ad559922edcd.html
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 < children.length; i++) {
attributes = children[i].attributes;
eventType = attributes.p_event;
trace(subject);
if (eventType == "refresh") {
display("refreshing...");
waitMillis = attributes.p_wait;
intervalID = setInterval(loadXML, waitMillis, host, refreshPath);
} else if (eventType == "join-listen-ack") {
sessionID = attributes.p_id;
refreshPath = refreshPath + sessionID;
} else if (eventType == "data") {
displayEvent(children[i]);
}
}
}
--------------------------------------------------然后输出数据为:
p_event=data p_subject=/CometDemo/TestRate JPY=76 p_seq=1 USD=73 RMB=74 p_time=1227756126 p_sid=nijul GBR=57
在这里只要将你需要的数据拿出来就可以了。具体如何解析xml就不用多说了。
由于pushlet的作者已经申请加入Cometd项目,并且pushlet存在伸缩性问题。但是对于小型应用还是很有帮助的。