SSE是Server-Sent Events的简称,用汉语来说就是“服务器发送事件”,但是下文会尽量采用英文原文“Server-Sent Events”,即SSE的全称。
SSE可以让服务器推送数据给web页面。其实Websocket也有这个功能。
SSE(Server-Sent Events) 和 Websocket 都能让服务器推送数据给web页面。但是二者特性与应用场景有所不同,因此并非是相互竞争性的技术。
Websocket连接可以使浏览器和服务器之间双向连接,相互发送、接收数据;Websocket最好的应用场景就是做网页聊天应用。
SSE连接是单向的,只能是服务器向浏览器推送数据。SSE最典型的应用场景有实时股价变化、twitter更新时间线列表、用户消息提示等。
在实践中,似乎只要是SSE能做的事情,Websocket都能搞定;而且Websocket的浏览器兼容性更高,同时SSE有最大连接数的限制,而Websocket则没有;这也就是为什么Websocket比SSE更流行、更被各浏览器支持。如果一个人学了Websocket可以解决一切此类问题,那他为什么还要去学SSE呢。是的,是可以不学SSE只学Websocket,但是在此还是建议对SSE进行了解一下,因为SSE与Websocket的应用场景并非一样,有一些场景,使用SSE会更轻便。(不过从不同的价值角度,优劣的取舍自然不同;贫僧推荐大家对SSE做到了解、对Websocket做到熟练使用。)
SSE相对Websocket还是有一些优势的:
总之一句话,SSE最大的优势就是简便。否则这个术语早就从地球上消亡了。
下表是每种浏览器支持SSE(Server-Sent Events)的最低版本:
API | |||||
---|---|---|---|---|---|
SSE | 6.0 | 不支持 | 6.0 | 5.0 | 11.5 |
如下所示,为了更好的用户体验,使用SSE前,可以提前检测一下用户浏览器是否支持SSE:
if(typeof(EventSource) !== "undefined") { // 浏览器支持SSE,下面就可以干正事了 } else { // 小贼,你的浏览器太落后了,竟然不支持SSE }
如下所示,EventSource
类创建的对象就是用来接收指定服务器来源的推送数据。
var source = new EventSource("demo_sse.php"); source.onmessage = function(event) { document.getElementById("result").innerHTML += event.data + "<br>"; };
服务器端代码比较简单,不管用哪种语言哪种web服务器框架,基本上都可以实现,但需要注意如下:
<!DOCTYPE html> <html> <body> <h1>收到服务器方的数据:</h1> <div id="result"></div> <script> if(typeof(EventSource) !== "undefined") { var source = new EventSource("/sse_test"); source.onmessage = function(event) { document.getElementById("result").innerHTML += event.data + "<br>"; }; } else { document.getElementById("result").innerHTML = "小贼,你的浏览器太落后了,竟然不支持SSE"; } </script> </body> </html>
事件 | 说明 |
---|---|
onopen | 当与服务器的连接被创建时而触发 |
onmessage | 当接收到服务器推送过来的数据而触发的事件 |
onerror | 发生错误时触发 |