django+websocket

目录

1.websocket相关

1.1轮询

1.2长轮询

1.3websocket

1.3.1 websocket底层原理(重点)

1.3.2 django中配置channels

 1.3.3 websocket 收发数据

小结:


1.websocket相关

实现一个系统:多个用户同时打开网页,呈现出来就是群聊

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聊天室
  • 柱状图,饼图, 实时图表更新(大屏)     

1.3.1 websocket底层原理(重点)

http协议(可以分成三个步骤)

        连接

        数据传输

        断开连接

websocket协议        是建立在http协议上的

  • 连接        客户端发起
  • 握手(验证),客户端发送一个消息,后端接受到消息再做一些特殊处理并返回,服务端支持websocket协议

        从请求【握手】信息中提取 Sec-WebSocket-Key

        利用magic_string 和 Sec-WebSocket-Key 进行hmac1加密,再进行base64加密

        将加密结果响应给客户端

        注:magic string为:258EAFA5-E914-47DA-95CA-C5AB0DC85B11        默认就是这个数据

  1. 客户端向服务端发送

        请求握手信息 

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-

你可能感兴趣的:(python,django,websocket,网络协议,网络)