Comet Jetty / Tomcat,Firefox和Chrome有一些浏览器问题

时间:2009-10-15 15:34:27

标签: firefox google-chrome jetty comet readystate

我正在探索将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 中,上述代码不起作用,并且只有当连接被关闭时才会调用回调用于3的状态服务器我得到输出。

  3. 我还想问一下使用Java进行Comet的最佳方法/框架。我目前在客户端使用jQuery 任何建议将不胜感激!!感谢

3 个答案:

答案 0 :(得分:0)

使用Jetty的彗星可以很好地与Bayeux和dojo配合使用。支持比简单的XMLHttpRequest更高级别。相反,您可以订阅单独的通道,并能够注册在通道上显示特定事件时触发的功能。在单个浏览器中与不同选项卡建立多个连接非常简单,并且(根据我的经验)可以使用Firefox,Chrome和Safari。

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

答案 1 :(得分:0)

我对Chrome的行为也不满意。

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

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

答案 2 :(得分:0)

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

解决方案1:我原来的想法:

我们可以在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千字节来获得第一个推送的有效载荷触发器(readyState == 3)。

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