websocket在django中的运用

14-2 聊天室实现思路:轮训、长轮训、websocket_哔哩哔哩_bilibili  参考大佬的B站学习笔记

https://www.cnblogs.com/wupeiqi/p/6558766.html    参考博客

https://www.cnblogs.com/wupeiqi/articles/9593858.html  参考博客


http: 是短连接,无状态的,一次性的,无法保证实时信息交互

  • 客户端主动连接服务器
  • 客户端向服务端发送消息,服务端接收到返回数据
  • 客户端接收到数据
  • 端口连接

websock协议创建持久的连接不断开,基于这个连接进行收发数据,建立在http上

  • 实时响应:接收发送消息
  • 实时图表,柱状图,饼图

websocket 原理:

  • 连接,客户端发起
  • 握手,客户端发送一个消息,后端接收到消息再做一些特殊处理返回(服务端要支持websocket协议)
  • 收发数据(加密)
  • 断开连接

握手流程:

        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-Key: mnwFxiOlctXFN/DeMt1Amg==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

         2.服务端接收:

请求和响应的【握手】信息需要遵循规则:从请求【握手】信息中提取 Sec-WebSocket-Key利用magic_string 和 Sec-WebSocket-Key 进行hmac1加密,再进行base64加密将加密结果响应给客户端注:magic string固定为:258EAFA5-E914-47DA-95CA-C5AB0DC85B11

 返回数据给客户端浏览器,验证通过则完成握手

HTTP/1.1 101 Switching Protocols"Upgrade:websocket"Connection: Upgrade"Sec-WebSocket-Accept: 密文

 收发数据流程:

数据 b'asdfa;efawe;sdfas;awdfawea;sdfasdfaf;sdfasdfa;'

先获取第二个字节,8位  10001010

再获取第二个字节的后七位   0001010  -> payload len

  • =127  2个字节,8个字节      其他字节(4字节 masking key + 数据)
  • =126  2个字节,8个字节      其他字节(4字节 masking key + 数据)
  • <=125  2个字节                     其他字节(4字节 masking key + 数据)
  • 获取masking key,然后对数据进行解密
    • var DECODED = "";
      for (var i = 0; i < ENCODED.length; i++) {
          DECODED[i] = ENCODED[i] ^ MASK[i % 4];
      }

实时交互的解决方案:

  1. 轮训,浏览器每隔一段时间向后台发送一次请求。缺点:有延迟、请求太多网站压力大
  2. 长轮询,客户端向服务端发送请求,保持一定的时间,一旦有数据就立即返回。特点:数据无延迟,常应用于大平台、WebQQ、Web微信
  3. websocket,客户端和服务端创建连接不断开,可以实现双向通信。特点:旧版浏览器不支持

django 中配置websocket

pip install channels  # 安装组件# 注册app
'channels'  # 配置asgi.application
ASGI_APPLICATION = 'web.asgi.application'

更新asgi文件(在支持http的基础上支持websocket)

# asgi.pyimport os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter,URLRouter
from . import routing
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'web.settings')application = ProtocolTypeRouter({'http':get_asgi_application(),'websocket':URLRouter(routing.websocket_urlpatterns),
})

创建routing文件在setting同级目录

from django.urls import re_pathfrom app import consumerswebsocket_urlpatterns = [re_path(r'ws/(?P<group>\w+)/$',consumers.ChatConsumer.as_asgi()),
]

创建app目录下consumer文件

from channels.generic.websocket import WebsocketConsumer
from channels.exceptions import StopConsumer"""
wsgi: 同步
asgi: 异步+asgi+websocket
"""
class ChatConsumer(WebsocketConsumer):def websocket_connect(self, message):# 客户端向后端发送websocket连接请求时自动触发# 容许和客户端创建连接self.accept()def websocket_receive(self, message):# 浏览器基于websocket向后端发送数据,自动触发接收消息print(message)self.send('不要回复!!!')def websocket_disconnect(self, message):# 客户端与服务端断开时自动触发raise StopConsumer

2024/02/26 更新中。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/702860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索网络通信的遗产:AppleTalk Data Stream Protocol (ADSP) 的全面解析

ADSP简介 AppleTalk Data Stream Protocol (ADSP) 是AppleTalk网络协议套件的一部分&#xff0c;设计用于在AppleTalk网络中提供端到端的可靠数据流服务。在1980年代和1990年代&#xff0c;AppleTalk是Apple计算机用于局域网通信的主要网络技术。ADSP提供了一种类似于现代TCP协…

conda 导出/导出配置好的虚拟环境

一. 导出环境配置&#xff08;yml文件&#xff09; 1. 在主目录下激活虚拟环境&#xff08;UE4是我的虚拟环境名称&#xff0c;请根据你自己的名称进行修改&#xff09; conda activate UE4 2. 运行此代码 conda env export > environment.yml 二. 导入环境配置&#xf…

创建第一个React项目

React脚手架 npx create-react-app react-demonpx是直接从互联网网上拉最新的脚手架进行创建react 运行React项目 npm start若想找到Webpack配置文件 npm ejectReact的基本使用 基本步骤 导入react和react-dom vue 创建react元素 渲染react元素到页面中导入 import React…

python统计分析——多解释变量的方差分析

参考资料&#xff1a;用python动手学统计学 1、导入库 # 导入库 # 用于数值计算的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 用于绘图的库 from matplotlib import pyplot as plt import seaborn as sns sns.set() # 用于估计…

Android 10 音量UI更新解析

1 VolumeUI 的启动 由于VolumeUI 是继承 SystemUI 的&#xff0c;所以它的启动方式和 SystemUI 的启动方式一样。 直接看 VolumeUI 的start()方法 frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java Override public void start() {boolean …

Linux基础命令—进程管理

基础知识 linux进程管理 什么是进程 开发写代码->代码运行起来->进程 运行起来的程序叫做进程程序与进程区别 1.程序是一个静态的概念,主要是指令集和数据的结合,可以长期存放在操作系统中 2.进程是一个动态的概念,主要是程序的运行状态,进程存在生命周期,生命周期结…

YY调音台:直播主播的体验

我是直播平台的主播&#xff0c;日常工作就是在直播间里打游戏、唱歌、聊天之类的。刚开始的时候我的直播工具只有一台电脑&#xff0c;收音也是用的我自己常用的耳机&#xff0c;设备比较简陋&#xff0c;直播间的用户留存率也不高。但是我相信天道酬勤&#xff0c;每天晚上坚…

javaScript数组去重的几种实现方式——适用非引用数据去重

最传统的使用循环遍历 //最传统的使用循环遍历 function getUnique(arr) {let newArr [];for (let i 0; i < arr.length; i) {for (let j i 1; j < arr.length; j) {if (arr[i] arr[j]) {i; //相同丢掉前面的元素}}newArr.push(arr[i]);}return newArr; } 利用Set实…

Seata分布式事务实战XATCC模式

目录 XA模式 XA 模式的使用 Spring Cloud Alibaba整合Seata XA TCC模式 TCC模式接口改造 TCC如何控制异常 Spring Cloud Alibaba整合Seata TCC XA模式 整体机制 在 Seata 定义的分布式事务框架内&#xff0c;利用事务资源&#xff08;数据库、消息服务等&#xff09;对…

【Python从入门到进阶】49、当当网Scrapy项目实战(二)

接上篇《48、当当网Scrapy项目实战&#xff08;一&#xff09;》 上一篇我们正式开启了一个Scrapy爬虫项目的实战&#xff0c;对当当网进行剖析和抓取。本篇我们继续编写该当当网的项目&#xff0c;讲解刚刚编写的Spider与item之间的关系&#xff0c;以及如何使用item&#xff…

【python】0、超详细介绍:json、http

文章目录 一、json二、http2.1 json 读取 request 序列化 三、基本类型3.1 decimal 四、图像4.1 颜色格式转换 一、json import json f open(data.json) # open json file data json.load(f) # 读出 json object for i in data[emp_details]: # 取出一级属性 emp_details, …

云尚办公-0.3.0

5. controller层 import pers.beiluo.yunshangoffice.model.system.SysRole; import pers.beiluo.yunshangoffice.service.SysRoleService;import java.util.List;//RestController&#xff1a;1.该类是控制器&#xff1b;2.方法返回值会被写进响应报文的报文体&#xff0c;而…

ChatRTX安装教程

介于本人一直想将现有的智慧城市的文档结合大模型RAG实现知识库问答助手&#xff0c;借着Chat With RTX的风潮正好将机器人和知识库合二为一&#xff0c;方便以后对众多文件进行查阅。 一、概要 Chat With RTX 是一个 Demo&#xff0c;用来将您自己的资料&#xff08;文档、笔…

关于硅的制造芯片的过程

芯片是如何制作的&#xff1f; 先将硅融化制成硅晶片&#xff0c;再用光刻机印压电路。 bilibili芯片制作视频 硅晶片作为现代芯片的主要元件&#xff0c;广泛用于集成电路。 首先将多晶硅放入特制的密封炉&#xff0c;排除其中空气后加热到1420摄氏度&#xff0c;将融化的硅放…

第三节:kafka sarama 遇到Bug?

文章目录 前言一、先上结果二、刨根问底总结 前言 前面两节&#xff0c;我们已经简单应用了sarama的两个类型Client和ClusterAdmin&#xff0c;其中有一个案例是获取集群的ControllerId&#xff0c;但是在后面的测试过程过程中&#xff0c;发现一个问题&#xff0c;返回的Cont…

vue菜单栏跳转方案

vue菜单栏跳转方案 <template><div><el-container style"height: 100vh"><el-aside width"200px" style"background-color: #b3c0d1"><el-menuopen"handleOpen"close"handleClose"select"h…

MongoDB聚合运算符:$bitXor

文章目录 语法用法举例 $bitXor聚合运算符返回整数或长整数数组元素按位异或的结果。 语法 { $bitXor: { [ <expression1>, <expression2>, ... ] }用法 如果操作数包括整型和长整型值&#xff0c;MongoDB会对计算出的整数结果进行符号扩展&#xff0c;并返回长…

处理器分支预测(Branch predictor)原理和实现

C++实例 我们先给一个实例,在windows系统下,使用VisualStudio的debug模式,编译和运行程序: #include <algorithm> #include <ctime> #include <iostream>int main(){// Generate dataconst unsigned arraySize = 32768;int data[arraySize];for (unsig…

循环队列和链表队列

循环队列&#xff1a; #include <iostream> using namespace std; const int MAX_SIZE 100; template <class DataType> /* 循环队列可以想象成一个环形&#xff0c;里面有一个个的格子&#xff0c;也就是环形数组 front表示首个&#xff08;但是这不会一直是0&a…

【PyQt5桌面应用开发】3.Qt Designer快速入门(控件详解)

一、Qt Designer简介 Qt Designer是PyQt程序UI界面的实现工具&#xff0c;可以帮助我们快速开发 PyQt 程序的速度。它生成的 UI 界面是一个后缀为 .ui 的文件&#xff0c;可以通过 pyiuc 转换为 .py 文件。 Qt Designer工具使用简单&#xff0c;可以通过拖拽和点击完成复杂界面…