跨浏览器的服务器推送事件(SSE),或者其替代方案,包括微软浏览器

3
根据Can I use?,MS IE和Edge浏览器不支持Server-sent Events
有解决方法吗?
或者是否有完全跨浏览器的替代方案,它与websockets一样简单(而且,在任何情况下,我更喜欢坚持HTTP而不是让多个同时协议复杂化)?
我希望AngularJs客户端能够订阅和取消订阅PHP服务器推送的JSON数据,多个客户端能够订阅相同的数据,只需要单个服务器动作即可推送它,最好不需要知道要推送给谁。
2个回答

5

微软(Microsoft)在SSE上的固执真是令人难以置信,因为实现它只是在 XMLHttpRequest2 的基础上增加了一层而已。标准十分简短,出版了三年的 O'Reilly 书籍内容详尽,而且至少有两个开源实现可以供参考。

无论如何,将兼容性恢复到IE8的推荐技术是创建一个隐藏的iframe,然后保持轮询其内部源代码,并返回其中的任何新内容:

iframe = document.createElement("iframe");
iframe.setAttribute("style", "display: none;");
iframe.setAttribute("src", "abc_stream.php");
document.body.appendChild(iframe); 

如果您只需要支持IE10及以上版本,可以使用XMLHttpRequest2对象,并监听readyState==3消息:

xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
    //Read this.responseText from the previous offset onwards
    };
var u = url;   
u += "xhr=1&t=" + (new Date().getTime());
xhr.open("GET", u);

这些技术在后端只需要非常少的支持:如果客户端正在连接真正的SSE,则必须将MIME类型设置为text/event-stream,但是如果使用xhr hack,则必须将其设置为text/plain。如上所示,我已将xhr=1附加到URL中(以及时间戳以防止其被缓存)。
xhr技术将适用于所有支持SSE的浏览器,如果您确实想使用单一解决方案。它唯一的缺点是完整的数据会在内存中不断地增加。(我建议每当responseText超过64KB时自动重新连接,或其他类似的方式)。

2

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