一、背景
http协议是一种单向的网络协议。其特点是只能有客户端向服务端主动发起请求,服务端被动响应。在实际场景中,很多应用比如监控、即时通信、即时报价等都需要将服务端发生的变化实时推送给客户端。传统的http协议要实现这种效果,只能通过客户端不断地刷新、发送请求实现,效率不高。
Web中实现实时通信,目前主要有如下几种方式:
1、轮询(polling)这种方式通过客户端按一定的频率间隔向服务端发送查询请求实现。比如,在js中通过setTimeout设置定时器,以一定的频率间隔发送ajax请求到服务端获取最新的数据。如下图所示:
轮询通过周期查询实现实时推送的效果。缺点也很明显:存在空载查询,浪费带宽,消耗服务器资源。间隔时间短,空载查询就多。间隔时间长,达不到实时推送的效果。
2、长轮询(comet)这种方式是对轮询方式的一种改进。原理是客户端发起查询请求后,服务端会阻塞这个请求直到有数据返回或者连接超时。当客户端收到响应后,再发起一个查询请求等待服务端响应。如下图所示:
长轮询通过阻塞请求,解决了空载查询的问题。但是&