http里面前端请求方式一般为客户端请求->服务端响应。即内容是一次性返回的,服务端若有更新,需要用户重新请求后才能获取。那么如何能实时获取服务端数据呢?现有方式一般为四种:轮询,长轮询,SSE,websoket。
轮询
即客户端定时请求服务器资源。
缺陷:
- 需要经常建立tcp连接,占用服务器资源,实时效果不好
- http1的队头阻塞问题,响应耗时长会影响后续的请求时间
- 需要客户端发起后服务端才能响应
长轮询
建立连接后,服务端将请求挂起,数据有更新时再进行响应,推送结束或到达超时时间后关闭连接。主要是解决轮询的缺陷1,即频繁建立连接的问题。使用http1时,页面功能复杂时不建议使用,会阻塞数据请求。
缺陷:
- 服务器长时间占用,阻塞后续的请求
- 需要客户端发起后服务端才能响应
SSE
全称是Server-Sent-Event。SSE也是使用http协议,和轮询不同的是不需要客户端先发起请求。SSE本质是建立一个http长连接,服务端以事件的形式发送数据流。SSE和websoket相比不需要处理断连问题。
缺陷:
- 需要考虑浏览器兼容性
- 服务器单向发送数据,支持文本类型,其他类型需要编码。
- 不使用http2时,每个域名下可建立连接数有限制。
websoket
全双工通信,独立的ws协议,建立连接后服务端主动进行推送,支持各种数据格式。
缺陷:
- 建立ws连接,需要心跳机制防止断连
- 复杂场景,如多页面多客户端如何推送,与轮询相比实现较为复杂