【问题标题】:Comet Jetty/Tomcat, having some browser issues with Firefox and ChromeComet Jetty/Tomcat,Firefox 和 Chrome 存在一些浏览器问题
【发布时间】:2010-12-07 02:05:24
【问题描述】:

我正在探索将 Comet 用于我正在进行的项目。
我尝试先使用 Tomcat6 和 CometProcessor API 创建测试应用程序,然后使用 Jetty7 Continuations。
该应用程序在两者上都可以工作,但我在消息的实际显示方面遇到了一些问题。
我使用了创建 XMLHttpRequest 连接并始终保持打开状态的技术,以便服务器可以在可用时将数据持续推送到所有连接的客户端。

我的客户端代码是这样的:

function fn(){
var xhr = new XMLHttpRequest();
 xhr.onreadystatechange = function(){

  if (xhr.readyState==3){
document.getElementById('dv').innerHTML =(xhr.responseText);
}
if (xhr.readyState==4){
alert ('done');
}
}
xhr.open("GET", "First", true);
xhr.send(null);
}

我在网上某处发现了使用 readyState 3 的东西。

我目前面临两个问题:

  1. Firefox 中,此代码运行良好。但是如果我打开一个新选项卡或什至一个新的浏览器窗口,它不会与服务器建立新的连接,并且新选项卡或窗口上不会显示任何内容,只有第一个选项卡/窗口会获得展示。我使用 wireshark 来检查这个,即使在打开第二个选项卡后,它也只显示 1 个连接。我无法理解为什么会发生这种情况。我已经阅读了 2 个连接的限制,但这里只有一个连接。

  2. 其次在Chrome中,上面的代码不起作用,并且为readystate 3不调用回调,只有当连接被关闭时服务器我得到输出。

我还想问一下用 Java 做 Comet 的最佳方式/框架是什么。我目前在客户端使用 jQuery。
任何建议将不胜感激!!谢谢

【问题讨论】:

    标签: firefox google-chrome jetty comet readystate


    【解决方案1】:

    在 Jetty 中使用 comet 可以很好地与bayeux 和dojo 一起使用。支持比简单的 XMLHttpRequest 更高级别。相反,您可以获得对单独频道的订阅,以及注册功能以在频道上出现特定事件时触发的能力。在单个浏览器中与不同选项卡建立多个连接非常简单,并且(根据我的经验)适用于 Firefox、Chrome 和 Safari。

    我有一个用 Java 运行的服务器和一个用 javascript 运行的客户端。

    【讨论】:

    • 我认为你没有回答这个问题。道场再强大,也没有魔法。应该有办法做基础设施的脏活。
    【解决方案2】:

    我也对 Chrome 的行为不满意。

    我的解决方案是在发送每个响应后关闭服务器上的流,并在收到每个响应后在客户端创建一个新请求(菊花链)。

    在此处查看我的纯 Tomcat 示例:http://sublemon.com/blog/?p=10

    【讨论】:

      【解决方案3】:

      Chrome 的这种有线行为真的很烦人。我试图找出 GMail(Google 自己的应用程序)如何在 Chrome 中实现 Comet,但没有合适的 Http Sniffer 来捕获 Chrome 的永久 HTTP 流量。

      解决方案一:我最初的想法:

      我们可以在 Comet Http 响应中包含“Content-Type: multipart/x-mixed-replace”标头。我测试了它。如果响应是多部分的,当 (xhr.readyState == 3) 为真时,xhr.responseText 不为空。

      唯一的问题是 xhr.responseText 是整个响应,而不是像 Firefox 那样“替换”响应。例如,服务器发送“A”,然后发送“B”替换“A”,然后发送“C”替换“B”。在 Firefox 中,当 xhr.readyState==4 时,您将获得“A”、“B”、“C”。在 Chrome 中,当 xhr.readyState == 3 时,您将获得“A”、“AB”和“ABC”。

      因此,您的客户端 javascript 应该解析 xhr.responseText 以提取推送的数据。

      解决方案 2: 这是 Safari http://lists.macosforge.org/pipermail/webkit-dev/2007-June/002041.html 推荐的。

      Webit 引擎在有足够的字节显示之前不会呈现推送的数据。据称需要初始 256 字节填充。我在 Chrome (4.1.249.1036 (41514)) 中尝试过。看起来需要大约 1 KB 才能触发第一个推送的有效负载触发器 (readyState == 3)。

      确保 XHR 不是在 onload 事件处理程序中直接发送。否则,页面标题或 URL 栏中会有加载指示符。

      【讨论】:

        猜你喜欢
        • 2012-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-15
        • 2014-05-06
        • 2011-01-20
        相关资源
        最近更新 更多