1 服务器推送技术
就是让用户在使用网络应用的时候,不需要一遍又一遍的去手动刷新
就可以及时获得
更新的信息。
比如视频弹幕,又比如在股票网站,往往可以看到,各种股票信息的实时刷新, 上面的这些都是基于服务器推送技术
。
常见的服务器推送技术
有:
- Ajax短轮询:就是用一个定时器不停的去网站上请求数据。
- Comet:基于
HTTP长连接
、无须在浏览器端安装插件的【服务器推】技术。
Comet实现有以下两个:
- 基于
AJAX
的长轮询 - SSE
1.1 SSE
SSE,即Server-Sents Event
,严格地说,HTTP 协议
无法做到服务器主动推送
信息。但是,有一种变通方法,就是服务器向客户端声明,接下来要发送的是流信息
(streaming)。
也就是说,发送的不是一次性
的数据包,而是一个数据流
,会连续不断地发送过来。这时,客户端不会关闭连接,会一直等着服务器发过来的新的数据流,视频播放就是这样的例子。
本质上,这种通信就是以流信息
的方式,完成一次用时很长地下载。
SSE
就是利用这种机制,使用流信息
向浏览器推送
信息。它基于HTTP协议
,目前除了 IE/Edge
,其他浏览器都支持。
SSE
与 WebSocket
作用相似,都是建立浏览器与服务器之间的通信渠道,然后服务器向浏览器推送
信息。
总体来说,WebSocket
更强大和灵活。因为它是全双工
通道,可以双向通信
;
SSE 是单向通道
,只能服务器向浏览器发送,因为流信息本质上就是下载。如果浏览器向服务器发送信息,就变成了另一次HTTP请求
。
1.1.1 优点
- 使用
HTTP协议
,现有的服务器软件都支持 - 属于
轻量级
,使用简单 - 默认支持
断线重连
- 一般只用来传送
文本
,二进制数据
需要编码
后传送 - 支持
自定义
发送的消息类型
1.1.2 HTTP头信息
服务器向浏览器发送的 SSE
数据,必须是 UTF-8
编码的文本,具有如下的 HTTP 头信息
:
Content-Type
: text/event-streamCache-Control
: no-cacheConnection
: keep-alive上面三行之中,第一行的
Content-Type
必须指定MIME
类型为event-steam
。
1.1.3 SSE 和 WebSocket 相比的优势
- 便利:不需要添加任何新组件,用任何你习惯的后端语言和框架就能继续使用。你不用为新建虚拟机、弄一个新的 IP 或新的端口号而劳神,就像在现有网站中新增一个页面那样简单。
- 服务端的简洁。相对而言,
WebSocket
则很复杂,不借助辅助类库基本搞不定。
1.2 WebSocket 通信
一种在 2011 年被互联网工程任务组(IETF)标准化的协议。
待解决的问题:既然底层的协议(HTTP)是一个请求/响应
模式的交互序列,那么如何实时
地发布信息呢?AJAX
提供了一定程度上的改善,但是数据流
仍然是由客户端
所发送的请求驱动的。还有其他的一些或多或少的取巧方式(Comet)。
WebSocket
规范以及它的实现代表了对一种更加有效地解决方案的尝试。简单地说, WebSocket 提供了“在一个单个的 TCP 连接上提供双向的通信……结合 WebSocket API
…… 它为网页和远程服务器之间的双向通信提供了一种替代 HTTP 轮询
的方案。”
WebSocket 在客户端
和服务器
之间提供了真正的双向数据交换
。
WebSocket 连接允许客户端和服务器之间进行
全双工通信
,以便任一方都可以通过建立的连接将数据推送到另一端。WebSocket 只需要建立一次连接
,就可以一直保持连接状态。这相比于轮询
方式的不停建立连接显然效率要大大提高。
Web 浏览器和服务器都必须实现
WebSocket协议
来建立和维护连接。
下一章节,将举例基于websocket的聊天应用。
2 技术比较
- | Ajax短轮询 | Servlet异步(长轮询) | SSE | WebSocket |
---|---|---|---|---|
浏览器支持度 | 最高 | 很高 | 中(IE/Edge均不支持) | 中(早期浏览器不支持) |
实时性 | 最低 | 较高 | 很高 | 很高 |
代码实现复杂度 | 最低 | 较低 | 容易 | 最复杂 |
连接性质 | 短连接 | 长连接 | 长连接 | 长连接 |
适用 | 需要服务极大量或极小量的用户,实时性要求不高 | 准实时性的应用,比较关注浏览器的兼容性 | 实时,基本都是文本交互的应用 | 实时,需要支持多样化的用户数据类型的应用或原生程序 |