1)服务器端推送的实现
接下来就大概说说服务器推送技术
服务器在响应请求时,HTTP使用MIME报文格式来封装数据。通常一个HTTP响应只能包含一个数据块。但MIME有一种机制可用一个报文(或HTTP 响应)表示将多个数据块,这种机制就是成为“multipart/mixed”的标准MIME类型。
对于服务器推送,使用一个“multipart/mixed”类型的变种–multipart/x-mixed-replace。这里,“x-”表示属于实验类型。“replace”表示每一个新数据块都会代替前一个数据块。也就是说,新数据不是附加到旧数据之后,而是替代它。
2)
目前据我所知,Servlet 2.5标准没有规定Server Push,即Asynchronous的API。所以各个不同的Java EE服务器都有自己的不同标准。
1. Tomcat servlet container中,用CometEvent的class来实现,而且一个Servlet class必须首先implement CometProcessor这个interface。
例子和讲解,是Apache官方的!http://tomcat.apache.org/tomcat-6.0-doc/aio.html
2. Resin服务器,也就是校内网用的服务器。大概是用com.caucho.servlet.cometCometController来实现。
http://www.caucho.com/resin/doc/resin-comet.xtp是官方的教程
3. WebSphere,也就是IBM的application server,是价格最贵的。可以用WebSphere Application Server Feature Pack for Web 2.0。
中文教程:http://www.ibm.com/developerworks/cn/web/wa-lo-w2fpak-comet/
4.甲骨文的WebLogic好像也有,不过没找到教程。
5、开源而又能和各种服务器良好兼容,那就是Pushlet。感觉他们源代码写的水平有限,当然是和Apache的源代码相比。
教程http://www.pushlets.com/。
在未来Servlet 3.0 API标准中,规定了Asynchronous Event,也就是对Server Push的支持。
http://jcp.org/aboutJava/communityprocess/edr/jsr315/index.html
目前我只知道未来的Tomcat 7一定会遵循Servlet 3.0标准。
文章
http://baike.baidu.com/view/2668625.htm
http://hi.baidu.com/zhenyk/blog/item/02a9d21f652d2765f724e47e.html
Tools
http://en.wikipedia.org/wiki/Comet_(programming)
http://www.ibm.com/developerworks/cn/web/wa-lo-comet/
工具
http://cometdproject.dojotoolkit.org/
http://groups.google.com/group/cometd-dev/
在Tomcat 6中,增加了对Comet的支持
Tomcat 6提供了CometProcessor和CometEvent接口,实现CometProcessor接口后不用在servlet中写doGet,doPoset方法,所有事件在BEGIN,READ,END,ERROR中实现。
CometProcessor 接口要求实现 event 方法。这是用于 Comet 交互的一个生命周期方法。Tomcat 将使用不同的 CometEvent 实例调用。通过检查 CometEvent 的 eventType,可以判断正处在生命周期的哪个阶段。当请求第一次传入时,即发生 BEGIN 事件。READ 事件表明数据正在被发送,只有当请求为 POST 时才需要该事件。遇到 END 或 ERROR 事件时,请求终止。
CometProcessor和CometEvent的技术文档
http://qujunxi.iteye.com/blog/1021687
Tomcat的comet原理其实同样很简单,它无非就是做了一件事情,它允许 servlet执行完毕后的response没有被回收,我们只要拿到这个Reponse的引用并保存起来,就可以随时从Server向Client端Push 数据了。每个连接一个线程的模型便非常简单。该模型对于 Comet 不大适用,但是,Java 对此同样有解决的办法。为了有效地处理 Comet,需要非阻塞 IO,Java 通过它的 NIO 库提供非阻塞 IO。两种最流行的开源服务器 Apache Tomcat 和 Jetty 都利用 NIO 增加非阻塞 IO,从而支持 Comet.
import org.apache.catalina.CometEvent;
import org.apache.catalina.CometProcessor;
CometAsyncFilter
CometRequestHandler
CometHandler
服务器推送技术java
http://duyouhua1214.iteye.com/blog/558204