背景
作为开发人员我们都知道,页面上获取服务器上的信息最主要的都是通过客户端发起http请求,进行三次握手,四次挥手来进行。在一些数据实时性展示要求比较高的场景下,就需要服务器获取到新数据后需要及时的将数据推送到前端。
早期的我们都是通过轮询(短轮询、长轮询)请求的方式来进行。web前端发展到现在,不管是长轮询还是短轮询都已经有自己的弊端,所以已经衍生出了新的推送方案websocket,eventSource。
什么是短轮询?
短轮询其实就是普通的定时检索。通过javascript的定时器setInternal定时器方法在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request请求,服务端在收到请求后,不论是否有数据更新,都直接对客户端进行响应。在服务端响应完成后,就会关闭这个Tcp连接,所以每次请求数据都会创建http请求。
- 优点:兼容性好容错性强,实现简单
- 缺点:前端需要不断的发起
http请求,占用了太多了服务器资源,在数据没有更新时发起的http都是多余的
什么是长轮询?
基于短轮询的缺点,衍生出了长轮询。长轮询是客户端发起http请求,服务器接收到http请求后,如果服务器没有数据更新,则这个http请求会被服务器挂起,直到请求超时由客户端再次发起请求,或者数据有变化了,服务器再把变化后的数据推送到前台。如此反复的进行轮询请求获取最新的数据。
- 优点:长轮询和短轮询比起来,明显减少了很多不必要的http请求次数,相比之下节约了资源
- 缺点:连接挂起也会导致资源的浪费
eventSource
eventSource又称SSE(Server-Sent-Events),一种服务器端到客户端(浏览器)的单项消息推送方案,它和轮询一样,也是基于http请求来完成的。但是和轮询不一样的是它是服务器与客户端建立连接后,服务器主动的向客户端进行数据推送。
- 优点
- SSE是一个轻量级协议,相对简单。
- SSE默认支持断线重连。
- SSE支持自定义发送的数据类型。
- SSE不支持CORS,参数url就是服务器网址,必须与当前网页的网址在同一个网域(domain),而且协议和端口都必须相同。
- 缺点
- 只适用高级浏览器,IE浏览器暂不支持
- 连接建立后,只能服务器给客户端推送数据,客户端无法给服务器端推送数据
websocket
SSE是服务器给浏览器单向推送数据的模式,如果在需要客户端给服务器发送消息时SSE显然不适合,这个时候我们就需要强大的数据推送功能websocket。websocket是一种在单个TCP连接上进行全双工通信的协议,与SSE最大不同就是浏览器和服务器建立连接后,双方可以互相发送消息。
- 优点
- WebSocket支持自定义发送的数据类型。
- WebSocket客户端和服务器端可以互相发送消息
- 缺点
- 消息连接后如果长时间没有消息通信,连接便会自动断开,需要发送心跳包,并且异常断开后需要重新重新连接。