3

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

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

更新:似乎 Firefox 能够通过将 XMLHttpRequest.responseType 设置为“moz-chunked-text”或“moz-chunked-arraybuffer”来支持这一点。不过其他浏览器不支持。无论如何可能不是最好的方法。

WebKit 相当于 Firefox 的“moz-chunked-arraybuffer”xhr responseType

4

2 回答 2

1

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

我相信你在想的是长轮询。服务器将其输出设置为分块的位置(有关 php 示例,请参阅如何使 PHP 生成分块响应)

一旦你有一个服务器发送一个分块的响应,你可以使用像这样的东西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,但它会处理如何让每个客户端获得尽可能好的性能。(在内部,它尝试使用 websockets 并退回到 flash 套接字,然后进行轮询,以便您获得新的浏览器的奇特速度,同时仍然支持所有人)

于 2013-08-27T18:50:22.980 回答
0

看看这个http://en.wikipedia.org/wiki/Comet_(programming)

我有一个使用 Ajax 轮询服务器的网页,我在其中实现了 Comet 服务器。浏览器向服务器发送请求,并且仅在服务器上触发事件时(在我的情况下,当文件完成生成时)接收响应。如果服务器在超时(30 秒)后没有响应,它会发送一个空响应。每次客户端收到 Ajax 响应时,它都会立即发送一个新请求。

优点是您不需要经常轮询服务器,只要服务器上有事件,您的客户端就会收到通知。

于 2013-08-27T19:00:11.187 回答