pushlet 学习一

协作平台的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下面的所有主题。

你可能感兴趣的:(JavaScript,jsp,Ajax,浏览器,Comet)