Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Comet Jetty/Tomcat,在Firefox和Chrome上存在一些浏览器问题_Firefox_Google Chrome_Jetty_Comet_Readystate - Fatal编程技术网

Comet Jetty/Tomcat,在Firefox和Chrome上存在一些浏览器问题

Comet Jetty/Tomcat,在Firefox和Chrome上存在一些浏览器问题,firefox,google-chrome,jetty,comet,readystate,Firefox,Google Chrome,Jetty,Comet,Readystate,我正在探索Comet在我正在从事的一个项目中的应用。 我尝试先使用Tomcat6和CometProcessor API,然后使用Jetty7 Continuations创建一个测试应用程序。 该应用程序可以同时处理这两个问题,但我在消息的实际显示方面遇到了一些问题。 我使用了创建XMLHttpRequest连接并保持其始终打开的技术,以便服务器可以在数据可用时将数据持续推送到连接的所有客户端 我的客户端代码与此类似: function fn(){ var xhr = new XMLHttpReq

我正在探索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的方法

我目前面临两个问题:

  • 在Firefox中,这段代码非常有效。但是,如果我打开一个新选项卡,甚至是一个新的浏览器窗口,它不会与服务器建立新连接,并且新选项卡或窗口上不会显示任何内容,只有第一个选项卡/窗口会显示。我使用wireshark来检查这一点,即使在第二个选项卡打开后,它也只显示1个连接。我无法理解为什么会发生这种情况。我读过关于2连接限制的文章,但这里只有一个连接

  • 其次,在Chrome中,上面的代码不起作用,readystate为3时不会调用回调,只有当服务器关闭连接时,我才能得到输出

  • 我还想问,用Java实现Comet的最佳方式/框架是什么。我目前正在客户端使用jQuery。

    如有任何建议,将不胜感激!!谢谢

    将comet与Jetty结合使用在bayeux和dojo中效果很好。支持级别高于简单的XMLHttpRequest。相反,您可以订阅单独的频道,并且可以注册在频道上出现特定事件时触发的函数。在一个浏览器中有多个到不同选项卡的连接是非常简单的,并且(以我的经验)可以与Firefox、Chrome和Safari一起使用


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

    我也对Chrome的行为感到不满

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


    请看我的纯Tomcat示例:。

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

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

    我们可以在Comet Http响应中使用“Content-Type:multipart/x-mixed-replace”头。我测试过了。如果响应是多端口的,xhr.responseText在(xhr.readyState==3)为真时不为空

    唯一的问题是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推荐的。

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


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

    我想你没有回答这个问题。无论dojo有多强大,都没有魔法。应该有办法做基础设施的脏活。