pushlet实例 php,Pushlet实例解析

1.1 Pushlet

1.1.1 介绍

Pushlet 是一个开源的 Comet 框架,在设计上有很多值得借鉴的地方,对于开发轻量级的 Comet 应用很有参考价值。

观察者模型

Pushlet 使用了观察者模型:客户端发送请求,订阅感兴趣的事件;服务器端为每个客户端分配一个会话 ID 作为标记,事件源会把新产生的事件以多播的方式发送到订阅者的事件队列里。

客户端 JavaScript 库

pushlet 提供了基于 AJAX 的 JavaScript 库文件用于实现长轮询方式的“服务器推”;还提供了基于 iframe 的 JavaScript 库文件用于实现流方式的“服务器推”。

JavaScript 库做了很多封装工作:

l定义客户端的通信状态:STATE_ERROR、STATE_ABORT、STATE_NULL、STATE_READY、STATE_JOINED、STATE_LISTENING;

l保存服务器分配的会话 ID,在建立连接之后的每次请求中会附上会话 ID 表明身份;

l提供了 join()、leave()、subscribe()、 unsubsribe()、listen() 等 API 供页面调用;

l提供了处理响应的 JavaScript 函数接口 onData()、onEvent()…

网页可以很方便地使用这两个 JavaScript 库文件封装的 API 与服务器进行通信。

客户端与服务器端通信信息格式

pushlet 定义了一套客户与服务器通信的信息格式,使用 XML 格式。定义了客户端发送请求的类型:join、leave、subscribe、unsubscribe、listen、refresh;以及响应的事件类型:data、join_ack、listen_ack、refresh、heartbeat、error、abort、subscribe_ack、unsubscribe_ack。

服务器端事件队列管理

pushlet 在服务器端使用 Java Servlet 实现,其数据结构的设计框架仍可适用于 PHP、C 编写的后台客户端。

Pushlet 支持客户端自己选择使用流、拉(长轮询)、轮询方式。服务器端根据客户选择的方式在读取事件队列(fetchEvents)时进行不同的处理。“轮询”模式下 fetchEvents() 会马上返回。”流“和”拉“模式使用阻塞的方式读事件,如果超时,会发给客户端发送一个没有新信息收到的“heartbeat“事件,如果是“拉”模式,会把“heartbeat”与“refresh”事件一起传给客户端,通知客户端重新发出请求、建立连接。

客户服务器之间的会话管理

服务端在客户端发送 join 请求时,会为客户端分配一个会话 ID, 并传给客户端,然后客户端就通过此会话 ID 标明身份发出 subscribe 和 listen 请求。服务器端会为每个会话维护一个订阅的主题集合、事件队列。

服务器端的事件源会把新产生的事件以多播的方式发送到每个会话(即订阅者)的事件队列里。

1.1.2实例

1.1.2.1服务端

新建消息发送源。

packagecom.pushlet.server;

importnl.justobjects.pushlet.core.Event;

importnl.justobjects.pushlet.core.EventPullSource;

publicclassHelloWorldPlushletextendsEventPullSource {

/**

* 设置消息推送的时间间隔.

*/

@Override

protectedlonggetSleepTime() {

return1000;

}

/**

* 推送消息事件方法.

*/

@Override

protectedEvent pullEvent() {

Event event = Event.createDataEvent("/helloworld");

event.setField("hellokey","hello world");

returnevent;

}

}

在sources.properties下配置消息发送源。

1.1.2.2 客户端

PL._init();

PL.joinListen('/helloworld');

functiononData(event) {

varresultArea = $('#result')[0];

if(event.get("hellokey") != undefined) {

resultArea.value = resultArea.value + event.get("hellokey") +'\n';

}

}

1.1.2.3 运行效果

从HTTP请求看出,pushlet是采用轮询的方式实现“服务端推”。

每一次轮询,pushlet把客户端监听的事件与事件源(Key)编码成“p_id”,获取服务端的响应后,通过“event.get("hellokey")”,从响应包中获取数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值