首先我会介绍几种解决实时通讯的方案然后介绍各自的优缺点最后对比
基于web前端,存在一下几种可实现即时通讯的方式:
- 短轮询(历史方案)
- Comet-ajax长轮询(历史方案)
- SSE
- WebSocket(主流)
短轮询
就是客户端定时发送请求,获取服务器上的最新数据,不是真正的即时通讯,但一定程度上可以模拟即时通讯的效果.
优点:浏览器兼容性好,实现简单
缺点:实时性不高,资源消耗高,存在较多无用请求,影响性能
Comet-ajax长轮询
- 游览器发出XMLHttpRequest请求,服务器接收到请求后,会阻塞请求直到有数据或超时才会返回
- 游览器js在处理返回信息(有数据或者超时)后再次发出请求,服务器收到请求后,会再次阻塞到有数据或者超时
优点:游览器兼容性好,不存在无用请求
缺点:服务器压力大(维护长连接会消耗较多服务器资源)
SSE
服务器推送事件,基于HTTP协议,允许服务端向客户端推送新数据的HTML5技术
(HTTP协议是无法做到服务器向客户端推送消息的,SSE做了一些处理)
优点:基于HTTP,无序太多改造就能用,比WebSocket 要简单一点
缺点:基于文本传输,效率没有WebSocket高,基于HTTP协议,不是严格的双向通讯
WebSocket(目前主流)
基于TCP协议的全新独立的协议,作用是在服务器端和客户端之间建立实时的双向通讯
WebSocket协议与HTTP协议保持兼容,但是布瑞融入HTTP协议,仅作为HTML5的一部分
优点:真正意义上的双向实时通讯,性能好.延迟底
缺点:由于独立于HTTP的协议,因此要使用的话需要对项目改造
使用复杂,需要引用成熟的库(如:Socket-io);并且无法兼容低版本的游览器