Pushlet的工作原理

在介绍comet的基本理论之后,pushlet是comet的一种实现,它主要利用Servlet容器(Tomcat和Jetty)在Servlet没有运行完毕(线程一直没有运行完毕),server不会主动关闭连接,这给web的进行长连接由server push data 到client端提供了基本的理论依据。

 

注:本文在修改之前说的Com是利用keep-alive功能,server不会主动关闭连接,这个说法经过笔者实践有点错误。我们知道在Tomcat线程模型图如下(BIO的方式):

阻塞式的IO的线程模型是,一个请求会用一个线程维护一个socket,以阻塞的方式读取数据。当socketServer accept客户端的请求后,会生成一个新的socket,同时从线程池中拿出一个线程attach到这个socket上。当Servlet的线程未完毕时,socket即使在keep-alive关闭的情况下,Tomcat也不会关闭socket,显然这种方式对Comet而言,不是很好的方式,因为一个线程维护一个socket,本身就是开销比较大。Pushlet同样是利用Servlet的工作线程,对于一个user维护一个这样的线程,pushlet的性能在高并发的情况下,线程开销较大,性能肯定是不好的,因此,有必要看看Tomcat里面对于Comet的支持了。


 

 

Pushlet作为一种comet理论的实现,其工作原理也比较简单,笔者花了两天时间看了它的源码,总结了它的工作原理如下图:

 



 

1.browser发送join命令到server,server产生唯一的ID给client端,用于标识这次会话的唯一性,Pushlet是用java.rmi.server.UID产生的唯一的标志会话的标志,此时server会把sessionID作为key,session对象作为value,存放到HashMap里面,然后通过response.getWriter().println()回调给browser

 

注意:server接收client的请求是通过一个统一的servlet入口,pushlet.java来接收,下同。

 

2.browser拿到sessionID,并发送listen命令,listen命令,有subject,提交给server,server首先验证Session HashMap里面有没有这个sessionID,验证通过后,回调给客户端listen_ack消息,同时开始从eventQueue取出数据,并update给客户端,这里的queue符合生产消费模式,eventsource是生产线程,它负责把数据enqueue入队列,如果满则等待,直到消费线程消费,消费线程负责消费,由于eventsource是sleep一段时间才enqueue,消费线程没有sleep,它采取的是while(alive)的方式,因此,从这里来说,消费速度应该快于生产速度的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pushlet 是一个开源的 Comet 框架,Pushlet 使用了观察者模式:客户端发送请求,订阅感兴趣的事件;服务器端为每个客户端分配一个会话 ID 作为标记,事件源会把新产生的事件以多播的方式发送到订阅者的事件队列里。 server端向浏览器client发送通知这种通讯模式在J2EE应用中很常见,通常使 Pushlet服务器端Java类UML图 Pushlet服务器端Java类UML图 用采用RMI、CORBA或者自定义TCP/IP信息的applet来实现。这些技术往往由于复杂而产生诸多不利之处:技术难以实现、存在防火墙限制(因为需要打开非HTTP的通讯端口)、需要额外的server开发和维护。并且除了刷新整个页面或者完全采用applet展示内容之外,很难找到别的方法将client端applet的状态和浏览器的页面内容集成在一起。 Pushlet是一种comet实现:在Servlet机制下,数据从server端的Java对象直接推送(push)到(动态)HTML页面,而无需任何Java applet或者插件的帮助。它使server端可以周期性地更新client的web页面,这与传统的request/response方式相悖。浏览器client为兼容JavaScript1.4版本以上的浏览器(如Internet Explorer、FireFox),并使用JavaScript/Dynamic HTML特性。而底层实现使用一个servlet通过Http连接到JavaScript所在的浏览器,并将数据推送到后者。有关JavaScript版本的知识请参看Mozilla开发中心提供的《JavaScript核心参考》和Stephen Chapman编写的《What Version of Javascript》。 这种机制是轻量级的,它使用server端的servlet连接管理、线程工具、javax.servlet API,并通过标准Java特性中Object的wait()和notify()实现的生产者/消费者机制。原则上,Pushlet框架能够运行在任何支持servlet的server上、防火墙的后面。当在client中使用JavaScript/DHTML时,Pushlet提供了通过脚本快速建立应用、使用HTML/CSS特性集成和布局新内容的便利方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值