SSE(server-Sent Events,服务器发送事件)是围绕只读Comet交互推出的API或者模式。
SSE API建立到服务器的单向链接,服务器经过这个链接能够发送任意数量的数据。服务器响应的MIME类型必须是text/event-stream,是浏览器中的JavascriptAPI能解析输出的格式。SSE支持短轮询、长轮询和HTTP流,能在断开链接时自动肯定什么时候从新链接。
支持SSE的浏览器:Firefox6+、Safari5+、Opera11+、Chrome、iOS4+版Safari。
(1)SSE API
建立一个EventSource事件,传进一个入口点:
var source = new EventSource("myevents.php");
传入的URL必须与建立对象的页面同源(相同的URL模式、域及端口)。
EventSource的实例有一个readyState属性:
0:表示正链接到服务器;
1:表示打开了链接;
2:表示关闭了链接。
三个事件:
* open:在创建链接时触发。
* message:在从服务器接收到新事件时触发。
* error:在没法创建链接时触发。
onmessage事件处理程序:
1 source.onmessage = function(){
2 var data = event.data;
3 //处理数据
4 //数据是字符串格式
5 }
默认状况下,EventSource对象会保持与服务器的活动链接。若是链接断开,还会从新链接。这意味着SSE适合长轮询和HTTP流。若是想强制当即断开链接而且再也不从新链接,能够调用close()方法。
source.close();
(2)事件流所谓的服务器事件会经过一个持久的HTTP响应发送,这个响应的MIME类型为text/event-stream。响应的格式是纯文本,最简单的状况是每一个数据项都带有前缀data:,如: data: foo data: bar data: foo data: bar事件流中的第一个message事件返回的event.data值为“foo”,第二个message事件返回的event.data值为“bar”,第三个message事件返回的event.data值为“foo\nbar”。对于多个连续的以data:开头的数据行,将做为多段数据解析,每一个值之间以一个换行符分隔。只有在包含data:的数据行后面有空行时,才会触发message事件,所以在服务器上生成事件流时不能忘了多添加这一行。经过id:前缀能够给特定的事件指定一个关联的ID,这个ID行位于data:行前面或后面皆可: data: foo id: 1设置ID后,EventSource对象会跟踪上一次触发的事件。若是链接断开,会向服务器发送一个包含名为Last-Event-ID的特殊HTTP头部的请求,以便服务器指定下一次该触发哪个事件。在屡次链接的事件流中,这种机制能够确保浏览器以正确的顺序收到链接的数据段。