Pushlet 是一个开源的 Comet 框架,Pushlet 使用了观察者模式:客户端发送请求,订阅感兴趣的事件;服务器端为每个客户端分配一个会话 ID 作为标记,事件源会把新产生的事件以多播的方式发送到订阅者的事件队列里。
server端向浏览器client发送通知这种通讯模式在J2EE应用中很常见,通常使用采用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特性集成和布局新内容的便利方法。
原理
Pushlet的基本使用形式是极为简单的。后面的一些示例会说明这一点。
Pushlet基于HTTP流,这种技术常常用在多媒体视频、通讯应用中,比如QuickTime。与装载HTTP页面之后马上关闭HTTP连接的做法相反,Pushlet采用HTTP流方式将新变动的数据主动地推送到client(客户端),再此期间HTTP连接一直保持打开。有关如何在Java中实现这种Keep-alive的长连接请参看Sun提供的《HTTP Persistent Connection》和W3C的《HTTP1.1规范》。
解决方案
让我们对应用进行这样的假设:拥有一个Java web server或者Java应用server,我们试图从server发送通知给client端浏览器。这里的解决方案可以分为:“轮询(polling)”、“服务端回调(server-side callbacks)”和“消息(messaging)”三类。
轮询
最简单的解决方案便是“定时刷新页面”。在HTML文档的头部使用HTML META标签,页面便可以每隔N秒自动reload一次。如果在此期间server端数据发生变化,那么我们可以获得新的内容,否则将得到相同的页面。虽然方法很简单,但是如何设置刷新间隔是让人头疼的大问题。
服务器回调
因为我们是“身经百战”的Java开发老手,所以经常会用到“服务端回调”。这种方式通过RMI或者CORBA将Server端的对象传输到Java applet客户端。
消息(MOM)
这种解决方案采用一个作为client的applet,它使用TCP/IP或者无连接的UDP、甚至多播协议来建立与消息中间件server的通讯,然后由server推送消息给client。你可以从例如SoftWired的iBus、IBM的MQSeries、BEA的WebLogic Event这些消息产品中直接挑选,或者自己使用基于socket的 .ObjectStream定制开发消息软件。
讨论(MOM)
上面三种解决方案在复杂性、安全性、性能、可测量性、浏览器兼容性、防火墙限制上各有优势、劣势。最佳解决方案依赖于你的应用需求。例如,在共享白板应用中,用户需要直接与“状态”交互,那么server端回调或者消息很可能会大显身手。
但在浏览器环境下,除非完全使用applet作为整个client应用,否则把来自于server的更新信息集成到页面中并非易事。如何在applet收到回调或者消息时变更页面相关内容?一个很“痛快”而又“痛苦”的解决方案就是在回调方法中使用AppletContext.showDocument(URL)方法来刷新整个页面。
由于HTML代码可以直接影响页面布局,直接使用来自server的数据更改HTML部分内容不是更好吗?这是web应用的理想方案,在server上内容动态改变时,从用户到server所需的交互是最小化的。作为对上面的解决方案的补充,我开发了Pushlet这种轻量级、瘦客户端的技术,它无需applet或者插件而直接与脚本/HTML集成在一起、使用标准HTTP连接、理论上可以部署到任何支持Java servlet的server上。但这并不意味着它将替换对前面解决方案,而是在你的开发“工具箱”中添加另一种选择。作为Java构架者/开发者,你可以自行权衡、选择、决定哪种适合应用的解决方案。
相关推荐
Pushlet和Comet技术是Web服务器向浏览器推送数据的两种策略,主要用于实现实时的、双向的通信。这两种技术在传统的HTTP协议基础上进行了扩展,克服了HTTP请求-响应模型的限制,使得服务器能够主动向客户端推送数据,...
2. **Pushlet白皮书**:这是一份关于Pushlet的详细介绍文档,可能涵盖了其设计原则、工作原理、使用方法以及优点等内容。白皮书分为英文版和中文版,方便不同语言背景的读者理解。 3. **源码分析**:"pushlet 2.0.3...
"使用Pushlet实现点对点发送.docx"和"使用Pushlet实现一对多的信息推送.docx"则分别介绍了这两种推送模式的实现方法。 通过深入研究这些文档和源码,你可以了解到Pushlet是如何在底层利用HTTP长连接来实现实时通信...
这里主要介绍Tomcat的Comet和Pushlet技术,以及如何利用它们来创建一个进度条功能。 **Comet技术** Comet是一种在客户端与服务器之间进行持久化连接的技术,它打破了传统的HTTP请求-响应模式,允许服务器主动向...
- **Pushlet的发布方法**:在《pushlet的三种发布方式.htm》中,介绍了Pushlet支持的三种不同发布数据的方式,这些可能包括了广播式推送、单播以及组播,每种方式适应不同的应用场景。 4. **事件模型**: - **...
本实例将介绍如何使用Pushlet实现服务端推送,并解决中文推送时出现的问题。 首先,我们来看Pushlet的基本原理。Pushlet基于Servlet和JSP技术,通过HTTP连接保持来实现实时通信。当客户端(浏览器)与服务器建立...
- Pushlet的基本架构和组件介绍 - 实现长连接的关键技术和策略 - 客户端和服务器端的通信协议 - 示例代码展示如何创建Pushlet服务器和客户端 - 遇到的问题和解决方法 - 性能优化和扩展性考虑 学习和理解Pushlet的...
博主在该博客中可能详细介绍了如何设置和运行Pushlet的简单示例,包括环境配置、代码实现以及可能出现的问题和解决策略。通常,这样的示例会涵盖以下几个关键知识点: 1. **服务器推送概念**:解释了服务器推送技术...
在博文《https://lzj0470.iteye.com/blog/969763》中,作者可能详细介绍了Pushlet的工作原理、使用方法以及如何在实际项目中应用。由于链接无法直接访问,以下是对Pushlet的一些通用知识的详细阐述: 1. **工作原理...
在IBM于2008年发布的技术报告中,详细介绍了服务器推送技术——即所谓的Pushlet。这项技术为Web应用程序的发展带来了革命性的变化,尤其是在异步通信方面。本文将根据报告内容深入探讨Pushlet的相关知识点,包括其...
在易智瑞(中国)信息技术有限公司的文档中,这些开源项目被翻译并加以介绍,旨在帮助中国开发者更深入地了解和利用这些工具,开发出符合中国市场需求的WebGIS应用。需要注意的是,这些文档包含版权声明,并且对内部...
总之,本篇文章可能详细介绍了如何利用Extjs和HTTP长连接技术实现一个实时聊天窗口。读者可以通过提供的博文链接进一步学习具体实现细节,如如何在Extjs中集成WebSocket库,或者如何使用Pushlet框架进行Comet通信。...
关于推技术的一篇论文,主要介绍了Pushlet的使用及示例。
本文详细介绍了如何使用 Maven 构建和部署 JAR 文件到本地以及远程仓库的过程。通过上述步骤,开发者可以方便地管理和分发自己的库或组件。需要注意的是,在部署过程中确保 `settings.xml` 和 `pom.xml` 中的配置...