跨浏览器服务器发送的事件,或替代方案,包括Microsoft浏览器

时间:2017-02-16 10:36:39

标签: server-sent-events server-push

根据Can I use?,MS IE&边缘浏览器不支持Server-sent Events

有解决方法吗?

或者是一个完全交叉的浏览器替代方案,它很简单(websockets似乎不是(并且,无论如何,我更喜欢坚持使用HTTP并且没有多个同步协议使事情变得复杂)? / p>

我希望AngularJs客户能够订阅&取消订阅PHP服务器推送的JSON数据,多个客户端可以订阅相同的数据,只需要一个服务器操作来推送它,最好不知道推送它的人。

2 个答案:

答案 0 :(得分:5)

微软对SSE的顽固是非常不可思议的,特别是因为实现它实际上只是XMLHttpRequest2的一层,标准很短,有一本很棒的O&#; 3年来,至少有两个开源实现可以从中获取灵感。

无论如何,推荐的兼容性回归到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时自动重新连接,或类似的东西。)

答案 1 :(得分:2)

MSIE有几个EventSource polyfills:

https://github.com/remy/polyfills/blob/master/EventSource.js

https://github.com/amvtek/EventSource

其中一个(不记得哪个)会定期显示恼人的警报消息,因此您可能需要编辑代码并将其删除。

您可以在此处找到使用示例:

https://github.com/mariomac/jeasse/blob/master/examples/chat-servlet3/src/main/resources/static/index.html