27. 长轮询 / WebSockets / 服务器发送事件
Last updated
Last updated
长轮询、WebSockets 和服务器发送事件之间的区别是什么呢?
长轮询、WebSockets 和服务器发送事件是在客户端(如网页浏览器)和网站服务器之间的主流通信协议。首先,我们从了解标准 HTTP 网络请求开始。以下是常规的 HTTP 请求的事件序列:
客户端打开连接,从服务器请求数据。
服务器计算响应。
服务器在开放的请求上将响应发送回客户端。
轮询是一个被绝大多数 AJAX 应用所使用的的标准技术。其主要思想是客户端向服务器重复轮询(或发送请求)以获得数据。客户端创建请求并等待服务器使用数据响应。如果没有可用的数据,则返回一个空的响应。
客户端打开连接,并使用常规 HTTP 从服务器请求数据。
请求的网页定期向服务器发送请求(例如 0.5 秒一次)。
服务器计算响应并将其发送回客户端,如同常规 HTTP 信息流。
客户端周期性地重复上述三步,从服务器获得更新。
轮询的问题是客户端必须持续向服务器请求新数据。结果是,大量响应是空的,导致 HTTP 开销。
这是传统轮询技术的一个变种,允许服务器在有数据的时候将信息推送给客户端。使用长轮询,客户端从服务器请求信息的做法和标准轮询一样,但是服务器可能不会立即响应。这是该技术有时被称作「挂起 GET」的原因。
如果服务器没有任何可以发送给客户端的数据,则不会发送空响应,而是保留该请求,等待到有数据的时刻。
一旦有数据,则将一个完整的响应发送给客户端。客户端然后立即重新从服务器请求信息,使得服务器将几乎总是有正在等待的请求,可以使用该请求发送数据以响应一个事件。
使用 HTTP 长轮询的应用的基本生命周期如下:
客户端使用常规 HTTP 创建初始请求,然后等待响应。
服务器延迟响应,直到有更新或者超时。
当有更新时,服务器向客户端发送一个完整的响应。
客户端通常发送一个新的长轮询请求,在接收到响应之后立即发送,或者经过暂停之后发送以允许一个可以接收的延迟时间段。
每个长轮询请求都有超时时间。如果因为超时导致连接关闭,客户端必须在连接关闭之后周期性地重新连接。
WebSocket 提供了在一个单独的 TCP 连接上的全双工交流频道。它提供了客户端和服务器之间的永久连接,双方都可以使用该链接在任何时间发送数据。客户端通过一个称为 WebSocket 握手的过程建立一个 WebSocket 连接。如果该过程成功,则服务器和客户端可以在任何时间双向交换数据。 WebSocket 协议使得客户端和服务器之间的交流开销更低,促进从服务器发出和发往服务器的实时数据传输。通过提供一个标准化的方法,使得在客户端没有请求数据的情况下,服务器可以向浏览器发送内容,并在保持连接打开的情况下允许信息来回交互,使得该协议变成可能。使用该方法,客户端和服务器之间可以有一个持续的双向对话。
在服务器发送事件下,客户端和服务器之间建立一个持久长期的连接。服务器使用该连接向客户端发送数据。如果客户端想要向服务器发送数据,它将请求使用另一个技术或协议实现。
客户端使用常规 HTTP 向服务器请求数据。
请求的网页打开向服务器的连接。
当有新信息时,服务器向客户端发送数据。
当我们需要从服务器到客户端的实时流量,或者当服务器循环生成数据并将会向服务器发送多重事件时,服务器发送事件是最好的。