协作平台的webim 是采用pushlet来做的,Pushlet
是一种comet
实 现:在Servlet机制下,数据从server端的Java对象直接推送(push)到(动态)HTML页面,而无需任何Java applet或者插件的帮助。它使server端可以周期性地更新client的web页面。
用 一个例子 介绍下pushlet 原理(完整代码见附件):push-js-stream.html
l是主框架文件,它以HTML Frame的形式包含其它两个页面。push-js-stream-pusher.jsp是一个JSP,它执行在server端,此文件内容如下:
/** Start a line of JavaScript with a function call to parent frame. */ String jsFunPre = " "; try { // Every three seconds a line of JavaScript is pushed to the client for (int i=1; i < 50; i++) { out.print(jsFunPre+" "+i+jsFunPost); out.flush(); } for (int i=1; i < 10; i++) { // Push a line of JavaScript to the client out.print(jsFunPre+"Page "+i+jsFunPost); out.flush(); // Sleep three secs try { Thread.sleep(3000); } catch (InterruptedException e) { // Let client display exception out.print(jsFunPre+"InterruptedException: "+e+jsFunPost); } } } catch (Exception e) { // Let client display exception out.print(jsFunPre+"Exception: "+e+jsFunPost); } out.print(jsFunPre+"DONE "+jsFunPost);?
可以看到server端不断推送js片段,而js片段在客户端是可以执行的,从而完成了从server端的Java到浏览器中的JavaScript的回调。
pushlet有三种连接方式stream,pull和poll。
stream就是开启一个长连接,服务端有数据是将数据推送到客户端。
pull/poll 这两种感觉是一样的,pull有推送的意思(默认方式),但是实际使用时还是通过ajax定时查询,感觉还是轮询的意思。
三种连接方式各有优缺点:
stream 好处是有新内容才输出,比较节省带宽等资源,坏处是长期占用了连接,丧失了无状态高并发的特点。
pull/poll 好处是保持了http server的无状态高并发,坏处是大量的pull动作其实是白费的。连接数量很多的话,服务器的压力会很大。
有个概念需要介绍下就是 subscribe (订阅),查看webim第一次请求连接
http://。。。/pushlet.srv?p_event=join-listen&p_format=xml-strict&p_mode=pull&p_subject=/ccs/chat
最后的参数p_subject=/ccs/chat,就是我们订阅的主题,以后的ajax请求都是从这个主题下获取数据。
以后扩展的话,可以添加其他的主题如
/ccs/weather等,在请求时
p_subject可设为/ccs,表示订阅/ccs下面的所有主题。