2009-10-15 56 views
3

我正在探索使用Comet作为我正在开发的项目。
我尝试先使用Tomcat6和CometProcessor API创建测试应用程序,然后再使用Jetty7 Continuations。
该应用程序是对两种工作,但我有一些与消息的实际显示问题。
我使用了创建XMLHttpRequest连接并始终保持打开状态的技术,以便服务器可以在数据可用时连续将数据推送到所有连接的客户端。Comet Jetty/Tomcat,Firefox和Chrome有一些浏览器问题

我的客户端代码是与此类似:

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. 火狐此代码的工作非常完美。但如果我打开一个新选项卡或甚至是一个新的浏览器窗口,它不会向服务器建立新的连接,并且新选项卡或窗口上不显示任何内容,只有第一个选项卡/窗口才会显示。我使用wireshark检查这个,即使在第二个标签打开后,它也只显示1个连接。我无法理解为什么会发生这种情况。我已阅读了有关2个连接限制的信息,但这里只有一个连接。

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

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

回答

0

与Jetty一起使用彗星可以很好地与bayeux和dojo一起使用。该支持比简单的XMLHttpRequest更高级别。相反,您可以订阅单独的频道,并可以注册在频道上出现特定事件时触发的功能。在单个浏览器中有多个连接到不同的标签是非常简单的,并且与Firefox,Chrome和Safari一起工作(以我的经验)。

我有一台运行在Java中的服务器和javascript中的客户端。

+0

我不认为你回答了这个问题。 无论道场有多么强大,都没有魔法。应该有办法做基础设施的肮脏工作。 – 2010-03-20 12:30:10

0

我也对Chrome的行为感到不满。

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

请参阅我的纯Tomcat示例:http://sublemon.com/blog/?p=10

0

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

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

我们可以有“内容类型:多重/ X - 混合替换”在彗星HTTP响应标头。我测试了它。如果响应是多部分的,当(xhr.readyState == 3)为真时,xhr.responseText不为空。

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

所以,你的客户端的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)。

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

相关问题