大致概括就是:

  • 轮询、长轮询,长连接
  • 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.数据收发环节:

  • 加密传输,客户端和服务端连接后默认不断开连接