我正在尝试使用ajax调用服务器上的流式终结点。该连接应该能够永远接受来自服务器的推送数据,但是XMLHttpRequest似乎可以缓冲整个响应。我只希望浏览器客户端一次接收每个数据块,然后转到下一个。

有什么办法可以防止这种行为?

更新:好像Firefox通过将XMLHttpRequest.responseType设置为等于“moz-chunked-text”或“moz-chunked-arraybuffer”来支持此功能。但是不支持其他浏览器。无论如何,可能不是最好的方法。

WebKit equivalent to Firefox's "moz-chunked-arraybuffer" xhr responseType

最佳答案

查看此Wiki http://en.wikipedia.org/wiki/Push_technology

我相信您正在考虑的是长期投票。服务器将其输出设置为分块的位置(有关php示例,请参见How to make PHP generate Chunked response)

一旦服务器发送了分块的响应,就可以使用类似https://github.com/flowersinthesand/portal的方式连续读取流。

如果您不能更改服务器传输编码,或者必须坚持使用Ajax,则另一种方法是让客户端轮询服务器以查找更改。诸如此类(使用jQuery来缩短它)

setInterval(function(){
   // last_updated lets you compare what's changed since the last call so you can stream updates. Or you could have the server respond with a certain amount of bytes, and then have this param remember where they are in the stream and send the next X bytes
   $.get("/my/endpoint?last_updated=" + (new Date().getTime()), function(d){
      console.log("Got response");
   });
}, 5000); // Refresh every 5 seconds

就个人而言,我使用Socket.io很幸运,它是基于node.js的,但是它将考虑如何使每个客户端都能获得最佳性能。 (在内部,它尝试使用websocket并回退到Flash套接字上,然后进行轮询,以便在仍然支持所有人的情况下获得新型浏览器的理想速度)

09-17 08:44