【Netty学习】9.WebSocket


1 服务器推送技术

就是让用户在使用网络应用的时候,不需要一遍又一遍的去手动刷新就可以及时获得更新的信息。

比如视频弹幕,又比如在股票网站,往往可以看到,各种股票信息的实时刷新, 上面的这些都是基于服务器推送技术

常见的服务器推送技术有:

  • Ajax短轮询:就是用一个定时器不停的去网站上请求数据。
  • Comet:基于HTTP长连接无须在浏览器端安装插件的【服务器推】技术。

Comet实现有以下两个:

  • 基于AJAX的长轮询
  • SSE

1.1 SSE

SSE,即Server-Sents Event,严格地说,HTTP 协议无法做到服务器主动推送信息。但是,有一种变通方法,就是服务器向客户端声明,接下来要发送的是流信息(streaming)。

也就是说,发送的不是一次性的数据包,而是一个数据流,会连续不断地发送过来。这时,客户端不会关闭连接,会一直等着服务器发过来的新的数据流,视频播放就是这样的例子。

本质上,这种通信就是以流信息的方式,完成一次用时很长地下载。

SSE 就是利用这种机制,使用流信息向浏览器推送信息。它基于HTTP协议,目前除了 IE/Edge其他浏览器都支持

SSEWebSocket 作用相似,都是建立浏览器与服务器之间的通信渠道,然后服务器向浏览器推送信息。

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

文章作者: Kezade
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Kezade !
评论
  目录