在以前为了实现服务器推送技术,所用的技术都是轮询。轮询是指由客户端每隔一段时间向服务器发出HTTP请求,然后服务器返回最新的数据给客户端。轮询的效率非常低,同时也非常浪费资源。为了解决这些问题伟大的工程师们就发明了WebSocket协议,并写入了HTML5规范。服务器向客户端推送消息除了WebSocket,还要有一种方法:Server-Sent Events,本文就将介绍两者以及两者之间的异同。
WebSocket是一种标准的网络通信协议,它提供了服务器和客户端之间的持久连接。WebSocket是双向的,这意味着服务器服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息。WebSocket的出现是为了解决HTTP协议的限制。首先,HTTP协议不是双向的。客户端请求服务器上的特定资源。一旦服务器找到资源并将其发送给客户端,连接就会关闭。这意味着在一个非常活跃的数据流上,将会有太多的服务器请求。与HTTP不同的是,WebSocket允许客户端浏览器和服务器之间的实时双向交互通信。简单地说,WebSocket使数据能够实时地从客户机传输到服务器,反之亦然。使用WebSocket API,你可以向服务器发送消息并接收事件驱动的响应,而无需轮询服务器以获取响应。使用WebSocket,应用程序的客户端和服务器端可以在不中断的情况下相互通信,因为在服务器响应后连接仍然是打开的。
Server-Sent Event是WebSocket的一种轻量替代方案,使用HTTP协议。是一种允许客户端从HTTP服务器接收更新的技术。并且使用Server-Sent Event是自动更新的。Server-sent Events 规范是 HTML 5 规范的一个组成部分,该规范比较简单,主要由两个部分组成:第一个部分是服务器端与浏览器端之间的通讯协议;第二部分则是在浏览器端可供 JavaScript 使用的 EventSource 对象;
理论上WebSocket和Server-Sent Event做的是同一件事,既都属于服务器推送技术的一种。两者也有如下的差异:
a. Server-Sent Event使用 HTTP 协议,现有的服务器软件都支持。WebSocket 是一个独立协议。
b. Server-Sent Event属于轻量级,使用简单;WebSocket 协议相对复杂。
c. Server-Sent Event默认支持断线重连,WebSocket 需要自己实现。
d. Server-Sent Event一般只用来传送文本,二进制数据需要编码后传送,WebSocket 默认支持传送二进制数据。
e. Server-Sent Event支持自定义发送的消息类型。
以上我们讲述了两种技术的特点,并展示它们的相同点和不同点。值得注意的是,这两种技术并不是相互竞争的技术,也没有哪一种明显优于另一种。我们可以根据具体的应用场景来决定使用哪一种技术。