在标准的HTTP模型中,服务器无法与客户端启动连接、发送未经请求的HTTP响应给客户端,因此,为了尽快接收异步事件,就需要服务器能在不等待的情况下向客户端发送更新消息,目前主要存在以下几种方法:
长/短轮询:(客户端拉动)
Iframe流:(服务端推送)
SSE:(服务端推送)
Websocket:(服务端推送)
轮询
轮询是客户端定期向服务端请求新数据的一种技术,主要分为短轮询和长轮询。
短轮询: 基于Ajax请求的计时器,固定延时调用;
长轮询:基于Comet(是一种用于web的推送技术,能使服务器实时地将更新的信息传送到客户端,而无须客户端发出请求),建立连接后,一直等待服务端有数据之后的响应(或超时),返回后再重新连接;
Iframe流(HTTP流式传输)
iframe流是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长连接,服务器向iframe传输数据(通常是HTML,对客户端js的调用)来实时更新页面。
Tip:轮询和Iframe流都属于Comet,一种用于web的推送技术,能使服务器实时地将更新的信息传送到客户端,而无需客户发出请求
SSE
Server-Send Events 实现了客户端请求服务端,然后服务端利用与客户端建立的这条通信连接push数据给客户端,客户端接收数据并处理。
本质:以流信息的方式通信,完成一次用时很长的下载。
特点:
1. 使用HTTP协议,现有的服务器软件都支持;
2. 轻量级,使用简单;
3. 默认支持断线重连,Websocket需要自己实现;
4. 一般只用来传送文本,二进制数据需要编码后传送;
5. 支持自定义发送的消息类型。
Websocket
Websocket是一种应用层协议,提供了客户端和服务端之间全双工通信机制。
特点:
1. 服务器可以主动向客户端推送消息,客户端也可以主动向服务器发送信息;
2. 建立在TCP协议之上,服务器端的实现比较容易;
3. 没有同源限制,客户端可以与任意服务器通信;
4. 协议标识符是ws(如果加密,则为wss),服务网址就是URL
5. 默认支持传送二级制数据,也可以传输文本。