我正在探索的一个项目,我的工作就用彗星。
我试图创建第一个使用的Tomcat6和CometProcessor API,然后用Jetty7延续测试应用程序。
该应用程序是一种工作,但两者我有消息的实际显示的一些问题。
我曾经创造了一个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中,上面的代码不工作,并且回调不调用为3 readyState的 ,只有当连接服务器我得到的输出关闭。
我还想问一下这是与Java做彗星的最佳方法/框架。 我目前使用在客户端的jQuery。
任何建议将不胜感激!! 谢谢
使用彗星码头与贝叶和道场效果很好。 支持比简单的XMLHttpRequest的更高的水平。 相反,你订阅独立的渠道,特别是当事件的通道上似乎触发注册功能的能力。 这是相当简单的在一个单一的浏览器不同标签的多个连接,并且工作(在我的经验)与火狐,Chrome和Safari。
我在JavaScript中使用Java的服务器运行和客户端。
我也很不满,Chrome的行为。
我的解决办法是每个发送响应,以及之后的每个响应中接收(菊花链)上创建的客户端的新请求之后关闭在服务器上的数据流。
见我的纯Tomcat的例子在这里: http://sublemon.com/blog/?p=10 。
Chrome浏览器的这种行为有线实在是烦人。 我试图找到我们的Gmail(谷歌自己的应用程序)如何在Chrome中实现彗星,但没有相应的HTTP嗅探器永远捉铬的HTTP流量。
方案1:我原来的想法:
我们可以有“内容类型:多重/ X - 混合替换”头在彗星HTTP响应。 我测试了它。 如果该响应被multiparted,xhr.responseText不为空时(xhr.readyState == 3)为真。
唯一的问题是,xhr.responseText是整个响应而不是作为Firefox没有“取代了”响应。 例如,服务器发送“A”,然后是“B”,以取代“A”,然后是“C”来替换“B”。 在Firefox中,你会得到“A”, “B”, “C”时xhr.readyState == 4。 在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栏加载指示灯。