IE只不支持Streaming的。 所以不能通过以下的代码来拿到comet的数据。
if (request.readyState == 3) {
if (request.status == 200) {
var increaseText = request.responseText.substring(index);
document.getElementById("cmessage").innerHTML = increaseText;
document.getElementById("message").innerHTML = document.getElementById("message").innerHTML + increaseText;
index = request.responseText.length;
document.getElementById("status").innerHTML = document.getElementById("status").innerHTML + "connected....<br>";
} else{
alert("status is " + request.status);
}
}else if (request.readyState==4 && request.status == 200){
document.getElementById("status").innerHTML = document.getElementById("status").innerHTML + "connection rest, try to re-connect.<br>";
connectComet();
index=0;
}
但是我们可以通过iframe的方法,但是用iframe的话浏览器会显示烦人的进度条。 我们可以通过以下的代码来避免。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Comet demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="prototype.js"></script>
</head>
<body>
<div id="content">The server time will be shown here</div>
<script type="text/javascript">
var comet = {
connection : false,
iframediv : false,
initialize: function() {
if (navigator.appVersion.indexOf("MSIE") != -1) {
// For IE browsers
comet.connection = new ActiveXObject("htmlfile");
comet.connection.open();
comet.connection.write("<html>");
comet.connection.write("<script>document.domain = '"+document.domain+"'");
comet.connection.write("</html>");
comet.connection.close();
comet.iframediv = comet.connection.createElement("div");
comet.connection.appendChild(comet.iframediv);
comet.connection.parentWindow.comet = comet;
comet.iframediv.innerHTML = "<iframe id='comet_iframe' src='./backend.php'></iframe>";
} else if (navigator.appVersion.indexOf("KHTML") != -1) {
// for KHTML browsers
comet.connection = document.createElement('iframe');
comet.connection.setAttribute('id', 'comet_iframe');
comet.connection.setAttribute('src', './backend.php');
with (comet.connection.style) {
position = "absolute";
left = top = "-100px";
height = width = "1px";
visibility = "hidden";
}
document.body.appendChild(comet.connection);
} else {
// For other browser (Firefox...)
comet.connection = document.createElement('iframe');
comet.connection.setAttribute('id', 'comet_iframe');
with (comet.connection.style) {
left = top = "-100px";
height = width = "1px";
visibility = "hidden";
display = 'none';
}
comet.iframediv = document.createElement('iframe');
comet.iframediv.setAttribute('src', './backend.php');
comet.connection.appendChild(comet.iframediv);
document.body.appendChild(comet.connection);
}
},
// this function will be called from backend.php
printServerTime: function (time) {
$('content').innerHTML = time;
},
onUnload: function() {
if (comet.connection) {
comet.connection = false; // release the iframe to prevent problems with IE when reloading the page
}
}
}
Event.observe(window, "load", comet.initialize);
Event.observe(window, "unload", comet.onUnload);
</script>
</body>
</html>
其次我们需要有自动连接的功能,当comet连接timeout时,
window.onload = function() {
var iframe = $("fullResponse");
iframe.src = "reader.php";
iframe.onload = disconnected;
if (iframe.readyState) setTimeout("MS_checkiframe(), 500);
}
function disconnected() {
// do whatever we normally do when we detect a disconnect
$("fullResponse").src = "reader.php";
if ($("fullResponse").readyState) setTimeout("MS_checkiframe(), 500);
}
function MS_checkiframe() {
if ($("fullResponse").readyState=="complete") {
disconnected();
} else {
setTimeout("MS_checkiframe()", 500);
}
}
最后是Tomcat comet servlet。
import org.apache.catalina.CometEvent;
import org.apache.catalina.CometProcessor;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
/**
* Created by IntelliJ IDEA.
* User: Denny
* Date: 2009-11-19
* Time: 11:42:30
* To change this template use File | Settings | File Templates.
*/
public class IECometServlet extends HttpServlet implements CometProcessor{
public static ArrayList<HttpServletResponse> connections =
new ArrayList<HttpServletResponse>();
public void init() throws ServletException {
}
public void destroy() {
connections.clear();
}
public void event(CometEvent event) throws IOException, ServletException {
HttpServletRequest request = event.getHttpServletRequest();
HttpServletResponse response = event.getHttpServletResponse();
if (event.getEventType() == CometEvent.EventType.BEGIN) {
event.setTimeout(Integer.MAX_VALUE);
System.out.println("Begin for session: " + request.getSession(true).getId());
PrintWriter writer = response.getWriter();
writer.println("<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">");
writer.println("<html><head><script type=\"text/javascript\">var comet = window.parent.comet;</script></head><body>");
writer.print("<script type=\"text/javascript\">");
writer.println("comet.printServerTime('Connection begin...');");
writer.print("</script>");
writer.flush();
synchronized (connections) {
connections.add(response);
}
} else if (event.getEventType() == CometEvent.EventType.ERROR) {
System.out.println("Error for session: " + request.getSession(true).getId());
synchronized(connections) {
connections.remove(response);
}
event.close();
} else if (event.getEventType() == CometEvent.EventType.END) {
System.out.println("End for session: " + request.getSession(true).getId());
synchronized(connections) {
connections.remove(response);
}
PrintWriter writer = response.getWriter();
writer.println("</body></html>");
event.close();
} else if (event.getEventType() == CometEvent.EventType.READ) {
InputStream is = request.getInputStream();
byte[] buf = new byte[512];
do {
System.out.println("Read for session: " + request.getSession(true).getId());
int n = is.read(buf); //can throw an IOException
if (n > 0) {
log("Read " + n + " bytes: " + new String(buf, 0, n)
+ " for session: " + request.getSession(true).getId());
} else if (n < 0) {
System.err.println("Impossible.");
return;
}
} while (is.available() > 0);
}
}
}
我们往response中写入javascript片段, 这段javascript会在iframe中执行,然后在parent window中显示出来。
参考:
http://ajaxpatterns.org/HTTP_Streaming#Detecting_a_disconnect
http://www.zeitoun.net/articles/comet_and_php/start
分享到:
相关推荐
tomcat实现comet例子,实现后台产生每隔几秒产生随机数,前台不刷新显示。tomcat实现comet例子,实现后台产生每隔几秒产生随机数,前台不刷新显示。tomcat实现comet例子,实现后台产生每隔几秒产生随机数,前台不...
值得注意的是,`comet4j-tomcat6.jar`适用于Tomcat 6版本,而`comet4j-tomcat7.jar`适用于Tomcat 7版本。如果您的Tomcat版本不同,应选择相应的JAR文件。 Comet4j的设计理念是降低实时通信的复杂性,提供简单易用的...
【标题】:“配置Tomcat支持Comet” 在Web开发中,传统的HTTP协议是基于请求-响应模型的,服务器端等待客户端发起请求,然后响应。但有些应用,如实时聊天、股票更新、在线游戏等,需要服务器能够主动推送数据到...
随着WebSocket的出现,提供了一种双向通信的更高效解决方案,但在某些场景下,如旧浏览器支持或轻量级应用,Comet仍是一个实用的选择。 总的来说,通过学习和实践如何在Tomcat上开发Comet实例,开发者可以更好地...
Comet4J是一个Java库,专门用于在Tomcat应用服务器上实现Comet技术,这是一种用于创建持久性HTTP连接的方法,以实现实时Web应用程序。在传统的HTTP协议中,客户端和服务器之间的通信是基于请求-响应模型的,而Comet...
【标题】"comet4j+tomcat6+tomcat7并附完整版Demo" 提供的是一种在Java后端与前端之间实现长连接通信的解决方案,主要涉及到的技术包括Comet4j、Tomcat 6和Tomcat 7。Comet技术是用于实现实时Web应用的一种方法,它...
标题中的"comet4j-tomcat6.jar"和"comet4j-tomcat7.jar"是针对Tomcat 6和7版本的特定兼容库。这两个JAR文件包含了Comet4j的核心组件,使得开发者能够在这些版本的Tomcat上部署和运行支持Comet的Web应用程序。它们...
接下来,`comet4j-tomcat6.jar`和`comet4j-tomcat7.jar`是专门为Tomcat 6和7设计的Comet4j服务器端库。这两个JAR文件包含了运行Comet4j所需的所有类和依赖,它们需要被添加到Tomcat服务器的类路径中。当Tomcat服务器...
在这个压缩包中,包含了针对Tomcat6和Tomcat7两个版本的Comet4J支持库以及对应的JavaScript库。 1. **Comet4J技术详解**: Comet技术是Web服务器与浏览器之间的一种持久连接方式,允许服务器在接收到新数据时主动...
【标题】:“Tomcat+Comet 实现终端与服务端同步的小例子” 在这个主题中,我们将探讨如何使用Apache Tomcat服务器和Comet技术来实现浏览器客户端与服务端的实时通信。Comet是一种Web应用程序设计模式,它允许数据...
Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架,消息以JSON方式传递,具备长轮询、长连接、自动选择三种工作...文件包含comet4j-tomcat6.jar , comet4j-tomcat7.jar , comet4j.js。
根据提供的博客链接,我们可以推测博主可能深入探讨了如何在 Tomcat 中实现 Comet 技术,包括但不限于以下几点: 1. **Comet 原理**:Comet 通过 HTTP 的 Keep-Alive 或 HTTP 1.1 的 chunked transfer encoding ...
标题中的"comet4j所需js与jar包(tomcat6与tomcat7)"表明,这个压缩包包含了Comet4J框架在Tomcat 6和Tomcat 7这两种版本的应用服务器上运行所需的JavaScript文件和Java类库。Tomcat是Apache软件基金会的一个开源...
但在实时应用如聊天、股票更新或在线游戏等场景中,这种模式不再适用,因为它不能有效地支持服务器主动推送信息到客户端。 Comet4j的核心理念是利用持久化连接(Long Polling)或HTTP流(HTTP Streaming)来突破...
1. `comet4j-tomcat6.jar` 和 `comet4j-tomcat7.jar`:这两个JAR文件是Comet4J为Tomcat 6和Tomcat 7优化的版本,它们提供了与Tomcat容器集成的能力,允许开发者在Tomcat环境下使用Comet4J实现服务器推送功能。...
【comet4j+Tomcat7 Demo】是一个用于展示如何在Tomcat7服务器上整合并使用Comet4j技术的示例项目。Comet4j是一个开源的Java库,专门设计用于实现Comet技术,即长轮询(Long Polling)和HTTP流,以实现在Web应用中...
comet两种实现之一的ajax实现,内部有源代码,这是一个聊天室的例子
Comet是一种古老的Web技术,用于实现实时的、双向的通信,它允许服务器向客户端推送数据,而无需客户端不断地发起请求。在Web开发中,这种技术对于构建实时应用,如聊天室、股票报价或者在线游戏等非常有用。本文将...