如何防止XMLHttpRequest缓冲整个响应

3
我正在尝试使用ajax调用服务器上的流媒体端点。连接应该能够永远接受来自服务器的推送数据,但XMLHttpRequest似乎会缓冲整个响应。我只想让浏览器客户端接收每个数据块一次,并转移到下一个数据块。
有没有什么方法可以防止这种行为?
更新:看起来Firefox可以通过将XMLHttpRequest.responseType设置为“moz-chunked-text”或“moz-chunked-arraybuffer”来支持此功能。其他浏览器不支持。可能不是最佳方法。 WebKit相当于Firefox的“moz-chunked-arraybuffer”xhr responseType

Ajax并不是真正意义上的永久开放和多消息传递的技术。虽然可以实现,但您需要自行确定响应中哪个部分是“新”的,或者需要定期回收连接(长轮询)。而WebSockets则更适合这种角色。 - Jonathan Lonowski
流式传输的 HTTP 端点(没有 WebSocket 切换)因此不适合浏览器客户端消费吗? - cachance7
换句话说,如果服务器数据以高频率流式传输,则长轮询将错过数据。 - cachance7
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 Sockets,然后轮询,因此您可以在支持所有人的同时为新的浏览器获得快速速度)

在我的情况下,数据以相当高的频率出现(<1秒之间)。我担心会错过在接收响应和发起新请求之间的数据间隙。 - cachance7
那么你需要寻找一个websocket、flash socket或分块响应。使用像socket.io这样的东西(如果可能,它会使用websockets)也可以让你获得事件驱动的响应。根据你的服务器设置(比如说,如果你正在使用apache + php),发送分块响应可能没有被优化;而socket.io则被设计成具有打开的套接字,以便一次发送小块数据。 - Will

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接