Comet是一种用于web的推送技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求。
目前有两种实现方式:
长轮询(long-polling)
长轮询就是客户端发起ajax请求,服务端会挂起该请求(通过循环),直到条件触发使服务器返回,在服务器返回前客户端一直处于pending,等待服务器返回。
iframe流(streaming)
通过在 HTML 页面里嵌入一个隐蔵帧,然后将这个隐蔵帧的 SRC 属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。
通过iframe里的内容进行长时间的请求,当需要传输内容时通过调用父页面js方法来实现页面展示,以此达到comet所需要的效果。
一个不足就是在IE、opera、chrome浏览器下,始终会显示下载没完成,并且鼠标及浏览器上的那个圈一直在转动,在 IE678下,google的大牛们通过使用“htmlfile”解决了这个问题,IE9我试了,并不支持”htmlfile”,当然IE9那个圈已经不 转了。但是opera、chrome不支持“htmlfile”,无法解决。
另一个问题就是请求的超时,我们需要判断当iframe超时时,对其刷新重新建立连接。在普通情况下,我们可以通过iframe的 onload事件进行刷新,当iframe连接内容超时时就会触发onload事件。在“htmlfile”下iframe却不支持onload,但是能 读取到iframe的readyState,当readyState为complete时即表示请求超时,所以我们可以通过setInterval来判断 iframe的readyState进行刷新
HTTP长连接实现“服务器推”的技术快速入门及演示示例
https://www.cnblogs.com/xingxiudong/p/3986886.html
Multipart XMLHttpRequest
但是由于应用太少,Firefox已经不支持了 参考https://bugzilla.mozilla.org/show_bug.cgi?id=843508
可以用 chunked XHR responses 和 Web Socket 替代。
chunked XHR responses
// chunked XHR 实现方法
var last_index = 0;
var xhr = new XMLHttpRequest();
xhr.open("GET", "/servers/scan");
xhr.onprogress = function () {
var curr_index = xhr.responseText.length;
if (last_index == curr_index) return;
var s = xhr.responseText.substring(last_index, curr_index);
last_index = curr_index;
console.log("PROGRESS:", s);
};
xhr.send();