【发布时间】:2011-08-17 21:22:27
【问题描述】:
我正在尝试解决如何在不折叠服务器的情况下为 IE 进行流式处理和长轮询。这是我的想法。
我将有一个名为 TimeServlet 的 servlet。
在 doGet 或 doPost() .. 我将暂停请求并在每一秒发送时间。
....
suspend()
while(!stopped){
request.writeln(new Date().toString());
}
或者使用 Scheduler 和 Runnable,但你明白了。
在客户端的 javascript 中,我将创建一个 ajax 连接。
我的大问题是:
1 - 如何使用 IE 进行流式传输?使用 Firefox 和 Chrome,我在 readyState==3 时读取数据,但在 IE 中,数据仅在 readyState==4 时可用。
2 - 在此示例中如何进行长轮询?长轮询阻塞,直到服务器有数据要推送,但在这个例子中,服务器总是有东西要推送,所以客户端会做类似 while(true) 的事情并淹没服务器。我想我必须做这样的事情
ajax.push(null) ... on readyState==4 -> read ... 之后 setTimeout(resendRequest, 1); //1 秒?
有人有这样的样本吗?
我的代码适用于 FF 和 Chrome,但现在我正在寻找 IE 和 Opera。
编辑
我发现我可以在 IE 中使用 XDomainRequest 进行流式传输。您必须在服务器代码中包含它:
response.setHeader("Access-Control-Allow-Origin","*");
我暂时不会回答这个问题,因为我不知道如何检测连接是否完成。
使用 Ajax,这很容易.. ReadyState==4。但我不知道 XDomainRequest。
我需要能够在连接关闭时触发一些 javascript 回调。有什么想法吗?
【问题讨论】:
-
我从来没有在 IE 中做过 comet,但是这里有一个对象,可以让您在接收数据时获取数据,XDomainRequest。 onprogress 事件应在数据传输时触发并授予您访问权限。我从未尝试过,所以我无能为力了,对不起:/
-
谢谢,但它与普通的“Msxml2.XMLHTTP”、“Microsoft.XMLHTTP”略有不同,但仅适用于 state4。 msdn.microsoft.com/en-us/library/ms535874%28v=vs.85%29.aspx
-
@Sebastien 是的,它是不同的,但它是在 IE8 或更低版本中访问的唯一方法,请参阅Here。
-
感谢安德鲁。非常好的网站。我会尝试并在此处使用代码发布回复
-
最后,在这一点上我无法让它工作。我收到 .onerror() 事件,而不是文本。我使用了帖子而不是获取。如果我将 URL 替换为“enhanceie.com/test/streamWithPrelude.aspx?"+Math.random()”,它将起作用。我认为问题可能出在服务器代码中。我可以在您的示例中看到它吗?
标签: ajax internet-explorer streaming comet long-polling