`
dengyin2000
  • 浏览: 1218949 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Tomcat6 comet, IE浏览器不支持Streaming ajax的解决方法小记

阅读更多
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
 
1
1
分享到:
评论
1 楼 kellersoon 2010-09-10  
// 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);  


在ff下依然有请求进度条,不知道你是怎么解决的,谢谢!

相关推荐

    tomcat实现comet例子 comet tomcat 随机数

    tomcat实现comet例子,实现后台产生每隔几秒产生随机数,前台不刷新显示。tomcat实现comet例子,实现后台产生每隔几秒产生随机数,前台不刷新显示。tomcat实现comet例子,实现后台产生每隔几秒产生随机数,前台不...

    配置tomcat支持comet

    【标题】:“配置Tomcat支持Comet” 在Web开发中,传统的HTTP协议是基于请求-响应模型的,服务器端等待客户端发起请求,然后响应。但有些应用,如实时聊天、股票更新、在线游戏等,需要服务器能够主动推送数据到...

    Tomcat 开发Comet实例

    随着WebSocket的出现,提供了一种双向通信的更高效解决方案,但在某些场景下,如旧浏览器支持或轻量级应用,Comet仍是一个实用的选择。 总的来说,通过学习和实践如何在Tomcat上开发Comet实例,开发者可以更好地...

    comet4j 所需js以及comet4j-tomcat6.jar、comet4j-tomcat7.jar包

    值得注意的是,`comet4j-tomcat6.jar`适用于Tomcat 6版本,而`comet4j-tomcat7.jar`适用于Tomcat 7版本。如果您的Tomcat版本不同,应选择相应的JAR文件。 Comet4j的设计理念是降低实时通信的复杂性,提供简单易用的...

    comet4j-tomcat6,comet4j-tomcat7,comet4j.js,以及一个样例

    Comet4J是一个Java库,专门用于在Tomcat应用服务器上实现Comet技术,这是一种用于创建持久性HTTP连接的方法,以实现实时Web应用程序。在传统的HTTP协议中,客户端和服务器之间的通信是基于请求-响应模型的,而Comet...

    comet4j+tomcat6+tomcat7并附完整版Demo

    【标题】"comet4j+tomcat6+tomcat7并附完整版Demo" 提供的是一种在Java后端与前端之间实现长连接通信的解决方案,主要涉及到的技术包括Comet4j、Tomcat 6和Tomcat 7。Comet技术是用于实现实时Web应用的一种方法,它...

    comet4j-tomcat6.jar和comet4j-tomcat7.jar和comet4j.js

    标题中的"comet4j-tomcat6.jar"和"comet4j-tomcat7.jar"是针对Tomcat 6和7版本的特定兼容库。这两个JAR文件包含了Comet4j的核心组件,使得开发者能够在这些版本的Tomcat上部署和运行支持Comet的Web应用程序。它们...

    comet4j-tomcat6-tomcat7-jar包以及js文件

    接下来,`comet4j-tomcat6.jar`和`comet4j-tomcat7.jar`是专门为Tomcat 6和7设计的Comet4j服务器端库。这两个JAR文件包含了运行Comet4j所需的所有类和依赖,它们需要被添加到Tomcat服务器的类路径中。当Tomcat服务器...

    comet4j-tomcat6.jar、comet4j-tomcat7.jar、comet4j.js

    在这个压缩包中,包含了针对Tomcat6和Tomcat7两个版本的Comet4J支持库以及对应的JavaScript库。 1. **Comet4J技术详解**: Comet技术是Web服务器与浏览器之间的一种持久连接方式,允许服务器在接收到新数据时主动...

    tomcat+comet实现终端与服务端同步的小例子

    【标题】:“Tomcat+Comet 实现终端与服务端同步的小例子” 在这个主题中,我们将探讨如何使用Apache Tomcat服务器和Comet技术来实现浏览器客户端与服务端的实时通信。Comet是一种Web应用程序设计模式,它允许数据...

    comet4j-tomcat7后台信息推送jar包

    总之,"comet4j-tomcat7后台信息推送jar包"是一个针对Tomcat7服务器的实时通信解决方案,它使得开发者能够轻松地实现Java后台向客户端浏览器的实时数据推送,极大地提升了Web应用的交互性和用户体验。在Java项目中...

    comet4j.js,comet4j-tomcat6.jar,comet4j-tomcat7.jar

    Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架,消息以JSON方式传递,具备长轮询、长连接、自动选择三种工作...文件包含comet4j-tomcat6.jar , comet4j-tomcat7.jar , comet4j.js。

    Tomcat comet 服务器推技术

    根据提供的博客链接,我们可以推测博主可能深入探讨了如何在 Tomcat 中实现 Comet 技术,包括但不限于以下几点: 1. **Comet 原理**:Comet 通过 HTTP 的 Keep-Alive 或 HTTP 1.1 的 chunked transfer encoding ...

    comet4j所需js与jar包(tomcat6与tomcat7)

    标题中的"comet4j所需js与jar包(tomcat6与tomcat7)"表明,这个压缩包包含了Comet4J框架在Tomcat 6和Tomcat 7这两种版本的应用服务器上运行所需的JavaScript文件和Java类库。Tomcat是Apache软件基金会的一个开源...

    comet4j-tomcat7.jar和comen4j.js

    虽然Comet4J-tomcat7.jar不支持Tomcat8及以上版本,但可以考虑使用其他服务器推送技术,如WebSocket,它已被现代浏览器广泛支持,并且有更丰富的库和工具。 通过理解这些关键概念和步骤,你可以有效地在Tomcat7...

    comet4j-tomcat7.jar comet4j.js

    但在实时应用如聊天、股票更新或在线游戏等场景中,这种模式不再适用,因为它不能有效地支持服务器主动推送信息到客户端。 Comet4j的核心理念是利用持久化连接(Long Polling)或HTTP流(HTTP Streaming)来突破...

    comet套件(comet4j-tomcat6/7.jar、comet4j.js)

    1. `comet4j-tomcat6.jar` 和 `comet4j-tomcat7.jar`:这两个JAR文件是Comet4J为Tomcat 6和Tomcat 7优化的版本,它们提供了与Tomcat容器集成的能力,允许开发者在Tomcat环境下使用Comet4J实现服务器推送功能。...

    comet4j+tomcat7 demo

    【comet4j+Tomcat7 Demo】是一个用于展示如何在Tomcat7服务器上整合并使用Comet4j技术的示例项目。Comet4j是一个开源的Java库,专门设计用于实现Comet技术,即长轮询(Long Polling)和HTTP流,以实现在Web应用中...

    comet的ajax实现

    comet两种实现之一的ajax实现,内部有源代码,这是一个聊天室的例子

Global site tag (gtag.js) - Google Analytics