WebSocket
基本概念
- WebSocket允许服务端主动向客户端推送数据
- 在WebSocket协议中
- 客户端浏览器和服务器只需要一次握手就可以创建持久性的连接
- 并在浏览器和服务器之间进行双向的数据传输
- HTTP、WebSocket
- 都是建立在TCP连接基础之上
- websocket协议是通过http协议来建立传输层的TCP连接
请求头
Connection
、Upgrade
:表示客户端发起的是WebSocket请求Sec-WebSocket-Version
:客户端所使用的的WebSocket协议版本号,服务端会确认是否支持该版本号Sec-WebSocket-Key
:一个Base64编码值,有浏览器随机生成,用于升级requestSec-WebSocket-Extensions
:客户端想要表达的协议级的扩展
响应头
HTTP/1.1 101 Switching Protocols
:切换协议,WebSocket协议通过HTTP协议来建立运输层的TCP连接Connection
和Upgrade
:表示服务端返回的是WebSocket响应
连接过程
目的:用户能够实时接受信息
JavaScript轮询
- 客户端发送GET,请求,服务器返回页面数据
- 客户端不停地发送请求,询问服务器是否有数据返回,服务器一直响应请求
- 这种方式,
服务器会浪费很多资源
WebSocket连接
- 1 .客户端通过HTTP协议发送GET请求,携带
Connection
和Upgrade
,指定要将HTTP协议升级成WebSocket协议 - 2 .服务器给客户端返回
HTTP/1.1 101 Switching Protocols
,表示协议切换成功 - 3 .服务端与客户端进行通信
优缺点及应用场景
- 优点:
- 支持双向通信,实时性更强
- 数据格式比较轻量,性能开销小,通信高效
- 支持扩展。用户可以扩展协议或者实现自定义的自协议(比如支持自定义压缩算法)
- 缺点
- 少部分浏览器不支持,浏览器支持的程度和方式有区别
- 长连接对后端处理业务的代码稳定性要求更高,后端推送功能相对复杂
- 成熟的HTTP生态下有大量的组件可以使用,WebSocket较少
- 应用场景
- 及时聊天通信,网站消息通知
- 在线协同编辑,如腾讯文档
- 多玩家在线游戏,视屏弹幕、股票基金实时报价
Django 使用 WebSocket
- 需要解决的问题
- 如何分辨路由(HTTP请求、WebSocket请求)
- 如何兼容Django的认证系统
- 如何接受和推送WebSocket消息
- 如何通过ORM保存和获取数据
- 由以上问题便引出我们的Django Channels
评论区