精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
服务器发送事件(Server-sent Events)是 HTML 5 规范中的一个组成部分,可以用来从服务端实时推送数据到浏览器端。相对于与之类似的 COMET 和 WebSocket 技术来说,服务器推送事件的使用更简单,对服务器端的改动也比较小。对于某些类型的应用来说,服务器推送事件是最佳的选择。本文对服务器发送事件的内容进行了详细的介绍,并给出了实例分析,希望可以对你们有帮助。
利用 SSE,网页可以自动获取来自服务器的更新。以前也可能做到这一点 ( 如 AJAX ),前提是网页不得不询问是否有可用的更新。通过服务器发送事件,更新能够自动到达。简单说就是把轮询获取更新的方式 ( pull ) ,改为接受服务器主动推送的方式 ( push )。
例子:Facebook/Twitter 更新、估价更新、新的博文、赛事结果等。
所有主流浏览器均支持服务器发送事件,除了 Internet Explorer。
EventSource 对象用于接收服务器发送事件通知:
在上面的 TIY 实例中,编写了一段额外的代码来检测服务器发送事件的浏览器支持情况:
if(typeof(EventSource)!=="undefined")
{
// Yes! Server-sent events support!
// Some code.....
}
else
{
// Sorry! No server-sent events support..
}
为了让上面的例子可以运行,您还需要能够发送数据更新的服务器(比如 PHP 和 ASP)。
服务器端事件流的语法很简单。把 "Content-Type" 报头设置为 "text/event-stream"。然后开始发送事件流。
PHP 代码 (demo_sse.php):
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');$time = date('r'); echo "data: The server time is: {$time}\n\n"; flush(); ?>
ASP 代码 (VB) (demo_sse.asp):
<%
Response.ContentType="text/event-stream"
Response.Expires=-1
Response.Write("data: " & now())
Response.Flush()
%>
在上面的例子中,我们使用 onmessage 事件来获取消息。也可以使用如下事件:
事件描述
onopen 当通往服务器的连接被打开
onmessage 当接收到消息
onerror 当错误发生
从服务器端推送数据给浏览器,以保证服务器端的数据变化可以在第一时间通知给用户。目前常见的解决办法有不少,主要可以分成两类。这两类方法的区别在于是否基于 HTTP 协议来实现。不使用 HTTP 协议的做法是使用 HTML 5 新增的 WebSocket 规范,而使用 HTTP 协议的做法则包括简易轮询、COMET 技术和本文中要介绍的 HTML 5 服务器推送事件。
简易轮询由于其本身的缺陷,并不推荐使用。COMET 技术并不是 HTML 5 标准的一部分,从兼容标准的角度出发,也不推荐使用。WebSocket 规范和服务器推送技术都是 HTML 5 标准的组成部分,在主流浏览器上都提供了原生的支持,是推荐使用的。不过 WebSocket 规范更加复杂一些,适用于需要进行复杂双向数据通讯的场景。对于简单的服务器数据推送的场景,使用服务器推送事件就足够了。