服务器推技术之Pushlets的使用

来源:互联网 发布:学插画知乎 编辑:程序博客网 时间:2024/04/30 01:25

转自: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存在伸缩性问题。但是对于小型应用还是很有帮助的。