轮询与长轮询

最开始的“实时”并非真正的实时,而是由客户端每隔一段时间询问一下服务端是否有新数据产生,而客户端的轮询间隔决定了数据有多实时。

img

轮询的过程如下:

  1. 客户端发起请求
  2. 服务端马上响应,不论有无新数据。
  3. 等待 n 秒(即一个轮询间隔)后,客户端再次发起请求。
  4. 服务端依旧马上响应。
  5. 如此往复。

可以看到如果数据更新出现在两次轮询之间(一般来说,轮询间隔都是以秒为单位,所以数据几乎都会出现在两次轮询之间),那么最新的数据会经历一定的延迟才能送达。

于是,聪明的开发者就发明了一个长轮询方案。

img

长轮询的过程如下:

  1. 客户端发起请求。
  2. 服务端不马上响应,而是等待到数据更新到达后才响应客户端。(当然,一定的等待时间后还是没有数据更新的话也是会响应的。)
  3. 客户端处理响应后,马上发起下一个长轮询请求。
  4. 如此往复。

与轮询相比,长轮询的优势就在于,数据更新几乎没有延迟就能送达到客户端。同时也减少了客户端与服务端建立连接的次数,降低了连接建立的开销。

短连接与长连接

轮询与长轮询常常也会跟短连接长连接比较。总的来说,短链接就是每次请求都会建立一个新的 TCP 连接用于通信;而长连接则是多次请求复用同一个 TCP 连接。

img