大致概括就是:
- 轮询、长轮询,长连接
- websocket
# AJAX轮询
- 客户端定时通过ajax查询服务端,服务器收到请求后立马返回响应信息并关闭连接
优点:实现简单
缺点:加重网络负载,浪费带宽和服务器资源
# 长轮询
AJAX的长轮询:
客户端发送请求,但是服务器会阻塞请求,直到有数据传递或超时才返回
客户端收到数据后,再次发送请求,建立连接
http和jsonp方式的长轮询
把script标签附加到页面上让脚本执行。服务器挂起连接直到有事件发生, 将脚本内容返回给浏览器,然后打开另一个script标签获取下一个事件, 从而实现长轮询xhr长轮询
客户端发送ajax请求等待响应
服务器做特殊处理挂起请求,触发事件才会返回数据并关闭请求
客户端收到信息,再次请求,这样循环下去
优点:错误处理和超时管理方便,不会频繁请求
缺点:客户端发起连接过多时服务器具有风险,且挂起请求过多仍然浪费资源
# 长连接
- 页面嵌套隐藏的iframe,它的src属性设置为一个长连接请求,服务器就能源源不断传输数据
优点:消息即时传递,不发无用请求
缺点:长连接消耗服务器资源
# WebSocket
1.握手环节验证服务器是否支持websocket:
- 浏览器访问服务端后,浏览器生成一个随机字符串
- 浏览器将随机字符串放在http协议头内发送给服务器
- 服务端和客户端都对字符串进行处理:跟magic string(固定的)拼接后加密
- 服务器将加密字符串放在http头内返回给浏览器,进行比对,判断是否一致
var ws = new WebSocket('ws://127.0.0.1:8080/')
2.数据收发环节:
- 加密传输,客户端和服务端连接后默认不断开连接
← 跨域