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-stream
- Cache-Control: no-cache
- Connection: 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均不支持) | 中(早期浏览器不支持) | 
| 实时性 | 最低 | 较高 | 很高 | 很高 | 
| 代码实现复杂度 | 最低 | 较低 | 容易 | 最复杂 | 
| 连接性质 | 短连接 | 长连接 | 长连接 | 长连接 | 
| 适用 | 需要服务极大量或极小量的用户,实时性要求不高 | 准实时性的应用,比较关注浏览器的兼容性 | 实时,基本都是文本交互的应用 | 实时,需要支持多样化的用户数据类型的应用或原生程序 | 


