HTML5 服务器推送事件(Server-sent Events)简介

在Web应用中,浏览器和服务器之间使用的是请求/响应的交互模式。浏览器发出请求,服务器根据收到的请求来生成相应的响应。浏览器再对收到的响应进行处理,展现给用户。响应的格式可能是HTML、XML或JSON等。随着REST架构风格和AJAX的流行,服务器更多地使用JSON作为响应的数据格式。Web应用使用XMLHttpRequest对象来发送请求,并根据服务器端返回的数据,对页面的内容进行动态更新。由XMLHttpRequest对象来发出请求,得到服务器响应之后进行页面的局部更新。这种方式的不足之处在于:服务器端产生的数据变化不能及时地通知浏览器,而是需要等到下次请求发出时才能被浏览器获取。对于某些对数据实时性要求很高的应用来说,这种延迟是不能接受的。

为了满足这类应用的需求,就需要有某种方式能够从服务器端推送数据给浏览器,以保证服务器端的数据变化可以在第一时间通知给用户。目前常见的解决办法有不少,主要可以分成两类。这两类方法的区别在于是否基于HTTP协议来实现。不使用HTTP协议的做法是使用HTML5新增的WebSocket规范,而使用HTTP协议的做法则包括简易轮询、COMET技术和本文中要介绍的HTML5服务器推送事件。下面会对这几种技术进行介绍。

一、WebSocket

WebSocket规范是HTML5中的一个重要组成部分,已经被很多主流浏览器所支持,也有不少基于WebSocket开发的应用。正如名称所表示的一样,WebSocket使用的是套接字连接,基于TCP协议。使用WebSocket之后,实际上在服务器端和浏览器之间建立一个套接字连接,可以进行双向的数据传输。WebSocket的功能是很强大的,使用起来也灵活,可以适用于不同的场景。不过WebSocket技术也比较复杂,包括服务器端和浏览器端的实现都不同于一般的Web应用。

二、简易轮询

浏览器端定时向服务器端发出请求,来查询是否有数据更新。这种做法比较简单,可以在一定程度上解决问题。不过对于轮询的时间间隔需要进行仔细考虑。轮询的间隔过长,会导致用户不能及时接收到更新的数据;轮询的间隔过短,会导致查询请求过多,增加服务器端的负担。

三、COMET

COMET技术改进了简易轮询的缺点,使用的是长轮询。长轮询的方式在每次请求时,服务器端会保持该连接在一段时间内处于打开状态,而不是在响应完成之后就立即关闭。这样做的好处是在连接处于打开状态的时间段内,服务器端产生的数据更新可以被及时地返回给浏览器。当上一个长连接关闭之后,浏览器会立即打开一个新的长连接来继续请求。不过COMET技术的实现在服务器端和浏览器端都需要第三方库的支持。

四、服务器发送事件(server-sentevent)

server-sentevent即服务器单向消息传递事件,网页可以自动获取来自服务器的更新。以前也可能做到这一点,前提是网页不得不询问是否有可用的更新。通过服务器发送事件,更新能够自动到达。如:Facebook/Twitter更新、估价更新、新的博文、赛事结果等。所有主流浏览器均支持服务器发送事件,除了InternetExplorer。

综合比较上面提到的4种不同的技术,简易轮询由于其本身的缺陷,并不推荐使用。COMET技术并不是HTML5标准的一部分,从兼容标准的角度出发,也不推荐使用。WebSocket规范和服务器推送技术都是HTML5标准的组成部分,在主流浏览器上都提供了原生的支持,是推荐使用的。不过WebSocket规范更加复杂一些,适用于需要进行复杂双向数据通讯的场景。对于简单的服务器数据推送的场景,使用服务器推送事件就足够了。

相关推荐