简单盘点一下服务端投送技术方案和各自的特点。
1.Ajax短轮询
Ajax短轮询:http 短轮询是 server 收到请求不管是否有数据到达都直接响应http请求;如果浏览器收到的数据为空,则隔一段时间,浏览器又会发送相同的http请求到server 以获取数据响应,就是用一个定时器不停的去网站上请求数据。
缺点:消息交互的实时性较低(server端到浏览器端的数据反馈效率低)。
2.Ajax长轮询
传统轮询类似,但是如果服务器端没有返回数据,那就保持连接一直开启,直到有数据时才返回。取回数据后再次发送另一个请求
http Keep-Alive: 请求头部和响应头部都有一个key-value , Connection: Keep-Alive,这个键值对的作用是让HTTP保持连接状态,
缺点:server 没有数据到达时,http连接会停留一段时间,这会造成服务器资源浪费;
3. Server-Sent Events(SSE)
SSE通过HTML5中的EventSource API实现。SSE会在客户端和服务器端建立一个单向的通道,客户端监听来自服务器端的数据,而服务器端可以在任意时间发送数据,两者建立类似订阅/发布的通信模式。
4. WebSocket
WebSocket 解决了 HTTP 的几个难题:
- (http协议的被动性):采用 WebSocket 协议后,服务器可以主动推送消息给客户端;而不需要客户端以(长/短)轮询的方式发起http请求到server以获取数据更新反馈;这样一来,客户端只需要经过一次HTTP请求,就可以做到源源不断的信息传送了(在程序设计中,这种设计叫做回调,即:server端有信息了再来通知client端,而不是client端每次都傻乎乎地跑去轮询server端 是否有消息更新);
- (http协议的无状态性/健忘性):短轮询是每次http请求前都要建立连接,而长轮询是相邻几次请求前都要建立连接;http请求响应完成后,服务器就会断开连接,且把连接的信息全都忘记了;所以每次建立连接都要重新传输连接上下文(下面有补充),将 client 端的连接上下文来告诉server端;而WebSockct只需要一次HTTP握手,整个通讯过程是建立在一次连接(状态)中的,server端会一直推送消息更新反馈到客户端,直到客户端关闭请求,这样就无需客户端为发送消息而建立不必要的 tcp 连接 和 为了建立tcp连接而发送不必要的冗余的连接上下文消息;
特点:
- HTML5中的协议,实现与客户端与服务器双向,基于消息的文本或二进制数据通信
- 适合于对数据的实时性要求比较强的场景,如通信、直播、共享桌面,特别适合于客户与服务频繁交互的情况下,如实时共享、多人协作等平台。
- 采用新的协议,后端需要单独实现
- 客户端并不是所有浏览器都支持
简单对比
轮询这类使用AJAX技术模拟服务器端推送的方法实现起来比较简单, 但通常会造成服务器资源上的浪费, 增加服务器的负担, 而且会让用户的设备耗费更多的电量(频繁地发起异步请求) 。SSE效率更高, 在浏览器的兼容性方面, 除了Windows IE/Edge, SSE基本上支持所有主流浏览器, 但浏览器通常会限制标签页的连接数量。