实现一个系统:多个用户同时打开网页,呈现出来就是群聊
http协议特点:
解决方案
轮询:让浏览器每隔2s向后台发送一次请求,缺点:延迟,请求太多网站压力太大
长轮询:客户端向服务端发送请求,服务器最多夯20s,一旦有数据就立即返回,数据的响应不延迟(大平台用这种方式做聊天室 webQQ、web微信)
websocket:客户端和服务器创建连接不断开,可以先实现双向通信
1.1轮询
- 访问/home显示的是聊天室界面
- 点击发送内容,数据发送到后台
- 定时获取消息,在界面上展示
1.2长轮询
- 访问/home/显示的聊天室界面,每个用户创建一个队列
- 点击发送内容,数据也可以发送到后台,扔到每个人的队列中
- 获取消息,去自己的队列中获取数据,然后在界面上展示
队列功能测试
import queue
q = queue.Queue()
q.put(123)
q.put("666")
v1 = q.get()
print(v1)
v2 = q.get()
print(v2)
try:
v3 = q.get(timeout=10) #如果没有人往队列中放数据就一直等待,timeout为等待10s
print(v3)
except queue.Empty as e:
pass
问题:
- 服务端持有这个连接,压力是否会很大
基于IO多复用+异步
1.3websocket
原来web中:
http协议 无状态&短连接
无状态:一次请求发、发送,断开连接后下一次再发请求,不知道上一次已经请求过了
短连接:一次请求 响应 断开连接
- 客户端主动连接服务端
- 客户端向服务端发送消息,服务器接收到返回数据
- 客户端接收数据
- 断开连接
https协议 除了http有的以外+对数据进行加密
我们开发过程中想要保留一些状态信息,基于cookie来做 cookie与http协议无关
现在支持:
http协议:一次请求一次响应
websocket协议:创建连续持久的连接不断开,基于这个连接进行收发数据【服务端向客户端主动推送消息用websocket】
- web聊天室
- 柱状图,饼图, 实时图表更新(大屏)
http协议(可以分成三个步骤)
数据传输
断开连接
websocket协议 是建立在http协议上的
- 连接 客户端发起
- 握手(验证),客户端发送一个消息,后端接受到消息再做一些特殊处理并返回,服务端支持websocket协议
从请求【握手】信息中提取 Sec-WebSocket-Key
利用magic_string 和 Sec-WebSocket-Key 进行hmac1加密,再进行base64加密
将加密结果响应给客户端
注: magic string为:258EAFA5-E914-47DA-95CA-C5AB0DC85B11 默认就是这个数据
请求握手信息
GET 
/
chatsocket HTTP
/
1.1
Host: 
127.0
.
0.1
:
8002
Connection: Upgrade
Pragma: no
-
cache
Cache
-
Control: no
-
cache
Upgrade: websocket
Origin: http:
/
/
localhost:
63342
Sec
-
WebSocket
-
Version: 
13
Sec
-
WebSocket
-
Original: https://blog.csdn.net/m0_43448734/article/details/127440692
Author: 伤情
Title: django+websocket
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/733897/
转载文章受原作者版权保护。转载请注明原作者出处!