Comet技术被称为下一代Ajax技术,主要通过实现server push来解决ajax需要定时频繁发送请求的问题。
通过Comet技术,客户端所需要的response信息不再需要主动的去索取,而是在服务器端以event的形式推至客户端。
Comet技术常见的实现方式
streaming和long polling
long poll:HTTP的连接保持,直到server端一个事件触发或者到达timeout事件。client端在收到response消息后,一个新的HTTP请求会立刻开放。通过这种方式,server端可以将数据在任何时候push到客户端。
streaming:在streaming方式中,HTTP的连接是始终保持的,即使客户端收到响应,HTTP连接也不断开。
Tomcat与Comet
在Tomcat 6中,增加了对Comet的支持,但是其自带例子(/webapps/examples/jsp/chat)有很多问题,没有运行成功,怀疑该例并不完整(我的版本Tomcat 6.0.16),经过学习和研究,发现了一些问题,希望能给仍然奋战在其中的朋友一些帮助。
前期准备:使用tomcat提供的comet api之前,需要增加对NIO的支持,配置nio可是相当方便,要做的仅仅是在server.xml里边修改connector:
<connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8080" redirectport="8443" connectiontimeout="20000">
Tomcat 6提供了CometProcessor和CometEvent接口,具体功能和操作不再赘述,详情请见http://tomcat.apache.org/tomcat-6.0-doc/aio.html。注意:实现CometProcessor接口后不用在servlet中写doGet,doPoset方法,所有事件在BEGIN,READ,END,ERROR中实现。
简单的Comet servlet代码示例:
Code
1 import java.io.*;
2 import javax.servlet.ServletException;
3 import javax.servlet.http.*;
4 import org.apache.catalina.CometEvent;
5 import org.apache.catalina.CometProcessor;
6 import org.apache.catalina.CometEvent.EventType;
7
8 public class cometServlet extends HttpServlet implements CometProcessor {
9
10 public void event(CometEvent e) throws IOException, ServletException {
11 if(e.getEventType() == EventType.BEGIN) {
12 // fill in code handling here
13 HttpServletResponse response = e.getHttpServletResponse();
14 PrintWriter out = response.getWriter();
15 out.write("Hello world");
16 out.flush();
17 //System.out.println("message sent");
18 }
19 if(e.getEventType() == EventType.READ) {
20 // fill in code handling here
21 }
22 // and continue handing other events
23 }
24 }
在此源代码中,仅完成向客户端发送Hello World字符串的功能,关键点,out.flush()不可缺少,以往在写ajax程序的时候,往往忽略写这句话,但这里如果不写,客户端无法收到响应文字。由于tomcat采用streaming的方式实现comet,不知是否不加这句话的时候,客户端不知道你的消息已经结束,而始终处于一个等待的状态(如果您有更专业的解释,请指教)。
服务器端javascript相关代码:
Code
1 <script>
2 function CometEx() {
3 var request = new XMLHttpRequest();
4 request.open("GET", 'http://localhost:8080/cometEx/cometServlet', true);
5 request.onreadystatechange = function() {
6 if (request.readyState == 3 && request.status == 200) {
7 alert(request.responseText);
8 }
9 }
10 request.send(null);
11 }
12 </script>服务器端代码类似与普通Ajax代码,其中,需要注意的是:request.readyState值如果设置为4,浏览器会处于长期等待状态,而收不到响应消息,设置为3后,firefox浏览器正常,但IE不能正常获得消息,由于在学习过程中,要求只用到firefox浏览器,并未对IE浏览器进行更深一步的研究(希望高手可以提供IE浏览器解决方案
分享到:
相关推荐
总的来说,这份“学习笔记 MHT3”集合了丰富的学习资源,涵盖Comet技术、Java基础、JavaScript进阶和Spring框架的高级应用,适合正在学习和提升这些技术的开发者进行深入研究。通过系统地学习和实践,可以增强开发者...
Comet.ml-机器学习实验管理 我们的Misson: Comet在为ML做着GitHub在做代码方面的工作。 我们允许数据科学团队自动跟踪其数据集,代码更改,实验历史和生产模型,从而提高效率,透明度和可重复性。 我们都力争在...
DWR学习资料 :DWR 3.0 上传文件.txt DWR3.0反向Ajax示例.txt DWR3.0学习笔记.txt DWR3.0学习网址.txt dwr分页.doc DWR分页代码.doc DWR中文文档.doc DWR中文文档.pdf dwr做comet的完整实现.doc Spring整合DWR comet ...
本笔记将深入探讨DWR的核心概念、工作原理以及实际应用。 一、DWR简介 DWR的主要目标是消除传统的HTTP请求-响应模式的局限性,提供一种更加高效、灵活的远程调用机制。通过DWR,开发者可以在浏览器中编写JavaScript...
【描述】"PyTorch学习日志,深度学习资源整理" 暗示了作者在学习过程中积累的经验和资料,可能包含了笔记、代码示例、问题解答和项目实践等。深度学习是一种模仿人脑神经网络结构的机器学习技术,广泛应用于图像识别...
【标题】:“openfire+smack开发webim笔记”涉及的知识点详解 【一】XMPP(可扩展消息处理现场协议) XMPP是一种基于XML的即时通讯协议,它最初源于Jabber项目,用于实现服务器之间的即时消息传递和在线状态探测。...
总的来说,这个学习笔记涵盖了JavaScript的基础知识、Ajax编程、jQuery框架以及相关插件的使用,为深入理解和实践JavaScript提供了坚实的基础。无论是前端开发还是全栈开发,掌握这些技能都是非常重要的。
"前端"、"nodejs"、"jsp自定义标签"这些文件夹名则直接对应了上述的技术领域,可能包含了相关的示例代码、教程或者笔记。综合来看,这个压缩包可能是为了分享或备份关于这些技术的学习资料和实践案例。
**PushTest6**:这个文件可能是演示如何实现服务器推(Server-Sent Events或Comet技术)的一个例子。在BlazeDS中,可以通过`PushService`来实现实时数据推送。`PushTest6`可能包含了Flex客户端的源代码,用于订阅...
:comet:源码学习 博客 :ant:数据结构与算法 :spider:设计模式 :honeybee:Javascript 语言标准 函数式编程 :butterfly:Nodejs Nest :lady_beetle:TypeScript :lizard:Vue :dolphin:React react :mobile_phone:跨端...
浩浩学习,天天向上。数学网课推荐的免费视频~~~ 此笔记与其线代网课相对应 如有遗漏或错误欢迎推PR或发Issue~ 欢迎补充完善:snowman_without_snow:~ PC端推荐使用【Ctrl】+【F】进行关键字定位 推荐 :snake: 想学...
:sparkles:如何实现一个通用的“划词高亮”在线笔记功能?:sparkles::crayon: 前端跨页面通信,你知道哪些方法? MongoDB高可用__使用Replica Set 各类“服务器推”技术原理与实例(Polling/COMET/SSE/WebSocket) ...
总之,ASP网上聊天室的设计是一个综合性的Web开发项目,涵盖了服务器端脚本、数据库操作、实时通信等多个技术领域,是学习和提升ASP编程技能的好实践。通过深入研究这个项目,不仅可以理解ASP的工作原理,还能掌握...