📖参考笔记:前端如何实现即时通讯(websocket)_前端通过webs-CSDN博客
即时通讯需求: 服务器数据一有更新, 希望推送给到浏览器。
有以下4种方法实现即时通讯:
- 短轮询 (历史方案)
开个定时器, 每隔一段时间发请求 (实时性不强)
- Comet - ajax长轮询 (历史方案)
发送一个请求, 服务器只要数据不更新, 就一直阻塞 (服务器压力过大)
- SSE
(利用了http协议, 流数据的传输, 并不是严格意义的双向通信, 无法复用连接)
- WebSocket (主流)
性能和效率都高!
短轮询 (历史方案)
短轮询就是客户端定时发送请求,获取服务器上的最新数据。不是真正的即时通讯,但一定程度上可以模拟即时通讯的效果。
优缺点:
- 优点:浏览器兼容性好,实现简单 setInterval
- 缺点:实时性不高,资源消耗高,存在较多无用请求,影响性能
Comet - ajax长轮询 (历史方案)
使用 Ajax 长轮询(long-polling)
- 浏览器发出XMLHttpRequest 请求,服务器端接收到请求后,会阻塞请求直到有数据或者超时才返回
- 浏览器JS在处理返回信息(有数据或者超时) 后再次发出请求。服务器收到请求后, 会再次阻塞到有数据或者超时
优缺点:
- 优点:浏览器兼容性好,即时性好,不存在无用的请求
- 缺点:服务器压力较大(维护⻓连接会消耗较多服务器资源)
SSE
服务端推送事件(Server-Sent Event),它是⼀种基于HTTP协议, 允许服务端向客户端推送新数据的 HTML5 技术。
参考详细教程:参考文章:SSE教程
优缺点:
- 优点:基于 HTTP,无需太多改造就能使⽤;相比 WebSocket 要简单一些
- 缺点:基于⽂本传输,效率没有 WebSocket ⾼;基于HTTP协议, 不是严格的双向通信
WebSocket (主流)
这是基于 TCP 协议的全新、独立的协议,作用是在服务器和客户端之间建立实时的双向通信。
优缺点:
-
优点:真正意义上的双向实时通信,性能好、延迟低
-
缺点:由于是独⽴于 HTTP 的协议,因此要使用的话需要对项⽬作改造;
-
使⽤复杂度会⾼一些,通常需要引⼊成熟的库 (如: Socket-io );并且⽆法兼容低版本的浏览器
HTTP 和 WebSocket 的连接通信比较图