【全栈开发】---- 一文掌握 Websocket 原理,并用 Django 框架实现
目录
介绍
底层原理
握手环节详解:
收发数据(加密)
Django 中配置 channels
1、注册 channels
2、在 settings.py 中添加 asgi_application
3、修改 asgi.py 文件
4、routing
5、consumers
实现 聊天室
介绍
WebSocket是一种先进的通信协议,旨在通过单个长时间运行的连接实现实时双向数据交换,极大地提升了Web应用程序的交互性和响应速度。不同于传统的HTTP请求-响应模型,WebSocket在客户端与服务器之间开启了一个持久化的连接,使得双方可以随时发送文本或二进制数据,无需为每次通信重新建立连接,从而减少了延迟并提高了效率。这种特性特别适用于需要实时更新的应用场景,如在线游戏、即时通讯、金融交易监控等。WebSocket协议不仅简化了开发流程,还确保了更高效的数据传输,支持更高的并发量和更低的资源消耗,成为现代Web开发中不可或缺的技术之一。此外,随着互联网技术的发展,WebSocket正逐渐成为构建高度互动和动态Web应用的标准选择,为企业提供前所未有的用户体验改进机会。
底层原理
http 协议:
。连接
。数据传输(请求和响应)
。断开连接
websocket 协议:
。连接,客户端发起
。握手(验证),客户端发送一个消息,服务端接收到消息后做一些特殊处理并返回。服务端支持 websocket 协议
。收发数据(加密)
。断开连接
握手环节详解:
创建完链接后,客户端会自己生成一串随机字符串,并且加密后以密文的形式存储到客户端,以明文发送给服务端,服务端加密后发送给客户端,客户端比较自己加密算法得到的密文与服务端发送过来的密文是否相同,若相同,则服务端支持 websocket 协议,即握手成功,可以进行下一步操作,否则则不支持。
客户端发送给服务端的是这玩意:
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
...
...
\r\n\r\n
服务端真正接收的是 Sec
-
WebSocket
-
Key
:
mnwFxiOlctXFN
/
DeMt1Amg
=
=
然后将服务端将 Sec-WebSocket-Key 与
magic_string 进行字符串拼接
magic_string 有个固定值:258EAFA5-E914-47DA-95CA-C5AB0DC85B11
再将拼接的字符串进行 hmac1 加密,再进行 base64 加密
服务端将最后加密得到的结果返还给客户端,返还新式如下:
"HTTP/1.1 101 Switching Protocols\r\n"
\
"Upgrade:websocket\r\n"
\
"Connection: Upgrade\r\n"
\
"Sec-WebSocket-Accept: 最终密文
然后客户端将服务端发送的密文和客户端自己产生的密文进行比较,相同则牵手成功。
收发数据(加密)
收发数据加密我看不懂,也不想去懂,大家可以自己搜搜视频看看。
Django 中配置 channels
django 默认不支持 websocket ,需要安装组件:
pip install channels
配置
1、注册 channels
INSTALLED_APPS = ["django.contrib.admin","django.contrib.auth","django.contrib.contenttypes","django.contrib.sessions","django.contrib.messages","django.contrib.staticfiles","app01.apps.App01Config","channels",
]
2、在 settings.py 中添加 asgi_application
ASGI_APPLICATTON = "lang_poll.asgi.application"
这里的 lang_poll 是自己的 Django 项目名称
3、修改 asgi.py 文件
原来的 asgi.py 文件只能处理 http 请求,现在加入 websocket 后需要修改:
"""
ASGI config for lang_poll project.It exposes the ASGI callable as a module-level variable named ``application``.For more information on this file, see
https://docs.djangoproject.com/en/5.1/howto/deployment/asgi/
"""import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter,URLRouter
from . import routingos.environ.setdefault("DJANGO_SETTINGS_MODULE", "lang_poll.settings")
# application = get_asgi_application()application = ProtocolTypeRouter({"http": get_asgi_application(),"websocket": URLRouter(routing.websocket_urlpatterns),
})
4、routing
asgi.py 中的 routing 是自己编写的文件,相当于 http 中的 urls.py,创建在 asgi.py 相同目录中:
from django.urls import re_path
from app01 import consumerswebsocket_urlpatterns = [re_path(r'ws/(?P<group>\w+)/$', consumers.ChatConsumer.as_asgi()),
]
5、consumers
这里的 consumers 也得自己创建,放在 app01 目录下,相当于 views.py ,用来编写 websocket 请求的响应逻辑:
from channels.generic.websocket import WebsocketConsumer
from channels.exceptions import StopConsumerclass ChatConsumer(WebsocketConsumer):def websocket_connect(self,message):# 客户端发送 websocket请求时,会自动触发这个函数# accept 函数允许客户端与服务端建立联系self.accept()def websocket_receive(self,message):# 客户端向服务端基于 websocket发送数据时,会自动触发该函数,并接收消息self.send("不要回复")# self.close() 是服务端主动断开连接def websocket_disconnect(self,message):# 客户端与服务端断开连接时,自动触发print("断开连接")raise StopConsumer()
实现 聊天室
前端页面可就用之前轮询的:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>.message{width: 200px;height: 300px;border: 1px solid orangered;}</style>
</head>
<body>
<div class="message" id="message"></div>
<div class="input"><input type="text" placeholder="请输入" id="txt"><input type="button" value="发送">
</div>
</body>
</html>
因为博主最近事比较多,聊天功能就不实现了,请见谅,后期会补回来的。
相关文章:
【全栈开发】---- 一文掌握 Websocket 原理,并用 Django 框架实现
目录 介绍 底层原理 握手环节详解: 收发数据(加密) Django 中配置 channels 1、注册 channels 2、在 settings.py 中添加 asgi_application 3、修改 asgi.py 文件 4、routing 5、consumers 实现 聊天室 介绍 WebSocket是一种先进的通信协议&…...
游戏引擎学习第135天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中,不使用任何现成的游戏引擎或第三方库,而是直接基于 Windows 进行开发,因为 Windows 目前仍然是游戏的标准平台,因此首先在这个环境中进行…...
国内支持Stable Diffusion模型的平台
国内支持Stable Diffusion模型的平台 截至2025年3月,国内支持SD模型的平台主要包括以下六类,覆盖不同用户需求和技术层级: 一、模型分享与下载平台 Liblib.ai 描述:国内最大SD原创模型社区,提供海量基础模型、Lora…...
扣子(Coze):重构AI时代的工作流革命
文章目录 扣子(Coze):重构AI时代的工作流革命使用Coze:一、工作流的本质:从单点智能到系统智能二、扣子工作流的技术基因三、场景化实践:从知识库到智能员工四、未来图景:AI Agent的进化之路结语…...
alloc、malloc 与 allocator:内存管理三剑客
内存管理是C语言开发者的核心能力,也是系统级编程的基石。 一、内存分配三剑客:malloc/calloc/realloc 1. malloc函数原理 int* arr (int*)malloc(5 * sizeof(int)); // 分配20字节空间(假设int为4字节) 从堆区分配指定字节的连…...
单细胞分析(21)——SCENIC 分析流程(singularity容器版)
SCENIC 分析流程笔记 SCENIC (Single-Cell rEgulatory Network Inference and Clustering) 是一种基于单细胞 RNA 测序数据的调控网络分析方法,主要用于识别调控因子(TFs)及其靶基因(Regulons),并评估这些…...
亚马逊云科技Marketplace(中国区)上架专业服务产品, “云生态连接器”价值凸显
近日,由西云数据运营的亚马逊云科技Marketplace(中国区)正式支持专业服务产品。此次发布将大幅简化企业对云专业服务的采购流程,实现云软件从规划、部署到支持的全生命周期管理,同时也为合作伙伴提供了更多的销售机会。…...
拉普拉斯·隆格·楞次矢量
L − R − L L-R-L L−R−L 矢量的推导 有平方反比有心力: F ⃗ − k r 2 r ^ \vec F-\dfrac{k}{r^2}\hat r F −r2kr^ 显然角动量 L ⃗ r ⃗ p ⃗ \vec L\vec r\times \vec p L r p 守恒。 故 ∣ L ⃗ ∣ Const \begin{vmatrix}\vec L\end{vmatrix}\…...
GStreamer —— 2.3、Windows下Qt加载GStreamer库后运行 - “教程3:动态管道“(附:完整源码)
运行效果(音频) 简介 上一个教程演示了GStreamer 概念。本教程中的管在它设置为 playing 状态之前完全构建。这没关系。如果 我们没有采取进一步的行动,数据会到达 pipeline 的 pipeline 和 pipeline 将生成错误消息并停止。但 我们将采取进一…...
jupyter notebook更改文件存储路径
默认情况打开是这样的 进入cmd或者Anaconda Prompt,输入以下命令 jupyter notebook --generate-config进入该目录 打开该文件,CTRLF 查找c.ServerApp.root_dir 进行修改。 这样就修改好啦!...
基于遗传算法的无人机三维路径规划仿真步骤详解
基于遗传算法的无人机三维路径规划仿真步骤详解 一、问题定义 目标:在三维空间内,寻找从起点到终点的最优路径,需满足: 避障:避开所有障碍物。路径最短:总飞行距离尽可能短。平滑性:转折角度不宜过大,降低机动能耗。输入: 三维地图(含障碍物,如立方体、圆柱体)。起…...
①EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器
EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器https://item.taobao.com/item.htm?ftt&id798036415719 型号 1路总线EC网关 MS-A2-1011 2路总线EC网关 MS-A2-1021 4路总线EC网关 MS-A2-1041 EtherCAT 串口网关 EtherCAT 转 RS485 技术规格 …...
Spring Boot WebFlux 中 WebSocket 生命周期解析
Spring Boot WebFlux 中的 WebSocket 提供了一种高效、异步的方式来处理客户端与服务器之间的双向通信。WebSocket 连接的生命周期包括连接建立、消息传输、连接关闭以及资源清理等过程。此外,为了确保 WebSocket 连接的稳定性和可靠性,我们可以加入重试…...
集合论之集合的表示法
目录 1. 说明 2. 常用表示法 2.1 枚举法(Roster Notation) 2.2 构建法(Set-builder notation) 3. 其它表示法 1. 说明 要表示一个集合,可以直接列出其元素,或者提供一种可以唯一地刻画其元素的方当。 2. 常用表示法 2.1 枚举法(Roster Notatio…...
【C语言】值传递与指针传递,以及 `.` 和 `->` 操作详解
在 C 语言中,函数参数的传递机制和结构体成员的访问方式是编程中的核心概念。值传递(pass-by-value)和指针传递(pass-by-pointer)决定了函数如何处理传入的数据,而 . 操作符 和 -> 操作符 则是访问结构体成员的两种主要工具。这两者密切相关,尤其在处理结构体时,它们…...
机器人训练环境isaac gym以及legged_gym项目的配置问题
完整的安装环境教程(强烈推荐):...
DeepSeek 开源周回顾「GitHub 热点速览」
上周,DeepSeek 发布的开源项目用一个词形容就是:榨干性能!由于篇幅有限,这里仅列出项目名称和简介,感兴趣的同学可以前往 DeepSeek 的开源组织页面,深入探索每个项目的精彩之处! 第一天 FlashML…...
冯 • 诺依曼体系结构
文章目录 冯 • 诺依曼体系结构的介绍冯 • 诺依曼体系结构的由来内存是如何提高冯•诺依曼体系结构效率的?为什么程序运行之前必须先加载到内存?从软件层面上再理解冯 • 诺依曼体系结构(QQ聊天的数据流动)一些知识的补充 冯 • …...
软考架构师笔记-存储管理
1.5 存储管理 存储管理 页式存储组织 虚地址 页号 | 页内地址页表 页号 | 块号物理地址 块号 | 页内地址访存两次:访问页表得到物理地址,根据物理地址得到数据就是把用户程序的空间分成若干页,把内存空间分成若干块,块和页的…...
【杂谈】信创电脑华为w515(统信系统)登录锁定及忘记密码处理
华为w515麒麟芯片版,还有非麒麟芯片版本,是一款信创电脑,一般安装的UOS系统。 准备一个空U盘,先下载镜像文件及启动盘制作工具,连接如下: 百度网盘 请输入提取码 http://livecd.uostools.com/img/apps/l…...
C#实现语音合成播报器——基于System.Speech的语音交互方案,在windows上实现语音播报指定文本
——基于System.Speech的语音交互方案,在windows上实现语音播报指定文本 一、语音合成播报应用场景 语音合成播报器广泛应用于以下领域: 工业控制:生产线异常报警、设备状态实时播报(如网页4中的WinCC语音报警插件)…...
【数据库】关系代数
关系代数 一、关系代数的概念二、关系代数的运算2.1 并、差、交2.2 投影、选择2.3 笛卡尔积2.4 连接2.5 重命名2.6 优先级 一、关系代数的概念 关系代数是一种抽象的数据查询语言用对关系的运算来表达查询 运算对象:关系运算符:4类运算结果:…...
点云滤波方法:特点、作用及使用场景
点云滤波是点云数据预处理的重要步骤,目的是去除噪声点、离群点等异常数据,平滑点云或提取特定频段特征,为后续的特征提取、配准、曲面重建、可视化等高阶应用打下良好基础。以下是点云中几种常见滤波方法的特点、作用及使用场景:…...
MWC 2025 | 移远通信大模型解决方案加速落地,引领服务机器人创新变革
随着人工智能、大模型等技术的蓬勃发展,生成式AI应用全面爆发。在此背景下,服务机器人作为大模型技术在端侧落地的关键场景,迎来了前所未有的发展机遇。 作为与用户直接交互的智能设备,服务机器人需要应对复杂场景下的感知、决策和…...
如何下载安装 PyCharm?
李升伟 整理 一、下载 PyCharm 访问官网 打开 PyCharm 官网,点击 "Download" 按钮25。 版本选择: 社区版(Community):免费使用,适合个人学习和基础开发。 专业版(Professional&#…...
STM32F407IGT的USB功能
使用STM32F407IGT的USB功能时,需注意硬件设计、协议配置、软件开发和调试等关键点。以下是分步指南和注意事项: 1. 硬件设计 USB接口选择: OTG FS(全速,12 Mbps):内置PHY,适用于简单应用(如HID、CDC)。OTG HS(高速,480 Mbps):需外接ULPI PHY芯片(如USB3300),…...
虚拟机IP配置
以下是在常见操作系统中配置虚拟机IP的一般步骤: 一、VMware Workstation(Windows或Linux主机下的虚拟机) 1. 桥接模式(Bridged)下的IP配置 - 在虚拟机设置中,将网络适配器设置为桥接模式。 - 启动虚拟机…...
机器学习-决策树详细解释
目录 一、预备知识 1.信息熵: 2.条件熵: 3.信息增益 4.基于信息增益选择分割特征的过程 5. C4.5算法 6.C435算法选择特征的策略 7 基尼不纯度: 二. 决策树的核心概念 1.树的结构 2.关键算法 三. 决策树的构建过程 1.特征选择 2.递归分割 3.停止条件 四. 决…...
kube-state-metrics镜像配置
在 Kubernetes 上部署 kube-state-metrics 时,镜像配置是非常重要的一步。kube-state-metrics 的官方镜像托管在 Google Container Registry (GCR) 上,但如果你无法直接访问 GCR,或者需要自定义镜像,可以按照以下步骤进行配置。 …...
计算机网络面试题
介绍一下Http常见的状态码 200 OK:最常见的成功响应码,表示服务器已成功处理了客户端的请求,请求的资源正常返回。400 Bad Request:表示客户端发送的请求存在语法错误或无法被服务器理解,如请求参数缺失、格式不正确等…...
Minix OS的配置 SSH C程序编译
Minix3的下载 官网:https://www.minix3.org/ 安装 平台:VMware 开机后进入系统使用setup命令来配置和安装尽量配置一个DNS服务器,比如8.8.8.8 SSH 安装:pkgin install openssh 修改配置文件,需要: 修…...
js的继承你了解多少
实现继承的方式有很多,下面我们来写常用的几种(包括但不限于原型链继承、构造函数继承、组合继承、寄生组合继承、ES6继承): 原型链继承 原型链继承通过修改子类的原型为父类的实例,从而实现子类可以访问到父类构造函…...
Docker 安装与使用
一.、Ubuntu如何安装docker 1、更新apt: sudo apt update 2、安装依赖包 sudo apt install apt-transport-https ca-certificates curl software-properties-common 3、添加Docker的官方GPG密钥: curl -fsSL https://download.docker.com/linux/ubuntu/…...
基于Asp.net的零食购物商城网站
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
FPGA基础 -- Verilog常用关键字
Verilog 是一种硬件描述语言(HDL),用于描述和设计数字电路。下面是 Verilog 的常用语法和关键概念: 1. Verilog 设计结构 Verilog 代码通常由 模块(module) 组成,每个模块表示一个硬件单元&…...
取消请求:axios.
axios.CancelToken和isCancel cancelToken的作用是获取取消函数,用来手动取消接口。 axios.isCancel的作用是在处理错误的时候判断当前错误,是否是由于取消导致的。 使用方式1 const testFun async () > {let cancel: any; // 保存取消函数// 发送…...
Element UI-Select选择器结合树形控件终极版
Element UI Select选择器控件结合树形控件实现单选和多选,并且通过v-model的方式实现节点的双向绑定,封装成vue组件,文件名为electricity-meter-tree.vue,其代码如下: <template><div><el-select:valu…...
粒子群优化算法(Particle Swarm Optimization, PSO)的详细讲解
一、粒子群算法(PSO)基本概念 1. 算法来源 灵感:模拟鸟群或鱼群在觅食过程中的群体协作行为。核心思想:通过个体历史最佳位置和群体全局最佳位置引导搜索方向。2. 与遗传算法的区别 特性PSOGA启发式来源群体协作(鸟类或鱼类行为)生物进化(自然选择、基因重组)解空间搜…...
小菜鸟系统学习Python-迭代实现斐波那契和汉诺塔问题
斐波那契: def fbnq(n):n1 1n2 1n3 1if n<1:print(输入错误,应该大于1)return -1while (n-2)>0:n3 n2 n1n1 n2n2 n3n-1return n3a fbnq(10) print(共有%d个兔子%a)汉诺塔: def hnt(n,x,y,z):if n1:print(x,->,z)else:hnt(n-1,x,z,y)#将前n-1个从x移到y上pri…...
轻松部署 Stable Diffusion WebUI 并实现局域网共享访问:解决 Conda Python 版本不为 3.10.6 的难题
这篇博文主要为大家讲解关于sd webui的部署问题,大家有什么不懂的可以随时问我,如果没有及时回复,可联系:1198965922 如果后续大家需要了解怎么用代码调用部署好的webui的接口,可以在评论区留言哦,博主可以…...
unity文字转语音usherpa-onnx-tts
usherpa-onnx-tts 语音识别(语音转文本、ASR) https://github.com/k2-fsa/sherpa-onnx/releases/tag/asr-models 文本到语音转换 (TTS) https://github.com/k2-fsa/sherpa-onnx/releases/tag/tts-models VAD系列 https://git…...
STM32---FreeRTOS时间片调度实验
一、简介 时间片调度:同等优先级任务轮流地享有相同的CPU时间(可设置),叫时间片,在FreeRTOS中,一个时间片就等于SysTick中断周期; 二、实验 实验设计: 把滴答定时器中断频率设置为…...
探秘 C 语言:编程世界的基石与传奇
一、C 语言的前世今生 C 语言诞生于 20 世纪 70 年代,由贝尔实验室的丹尼斯・里奇(Dennis Ritchie)开发。它最初是为了配合 UNIX 操作系统的开发,旨在提供一种高效、灵活且可移植的编程语言。在那个硬件资源有限的年代࿰…...
MySQL查询语句完全指南:从基础到高阶实战
一、开篇:为什么选择MySQL查询作为切入点? 根据Stack Overflow 2023开发者调查,MySQL以51.1%的使用率蝉联最受欢迎数据库榜首。其查询语句作为数据操作的基石,支撑着全球数百万应用的日常运转。本指南将通过2000字详解和30个实战…...
AJAX 数据库
AJAX 数据库 引言 随着互联网技术的飞速发展,前端与后端之间的交互需求日益增长。AJAX(Asynchronous JavaScript and XML)作为一种强大的技术,在实现这种交互中发挥着关键作用。本文将深入探讨AJAX技术与数据库的融合,分析其在现代Web开发中的应用及其优势。 AJAX简介 …...
正则表达式梳理(基于python)
正则表达式(regular expression)是一种针对字符串匹配查找所定义的规则模式,独立于语言,但不同语言在实现上也会存在一些细微差别,下面基于python对常用的相关内容进行梳理。 文章目录 一、通用常识1.通配符ps.反义 2.…...
Python项目-基于深度学习的校园人脸识别考勤系统
引言 随着人工智能技术的快速发展,深度学习在计算机视觉领域的应用日益广泛。人脸识别作为其中的一个重要分支,已经在安防、金融、教育等多个领域展现出巨大的应用价值。本文将详细介绍如何使用Python和深度学习技术构建一个校园人脸识别考勤系统&#…...
在PyCharm开发环境中,如何建立hello.py文件?
李升伟 整理 一、分析 首先,用户可能是刚接触PyCharm或者Python的新手,所以需要从打开软件开始讲起。不过用户可能已经安装好了PyCharm,但也许需要确认是否已经正确安装。不过问题重点在创建文件,可能不需要深入安装步骤。 接下…...
常见的网络协议介绍
一、什么是网络协议 指的是通信双方的数据发送和接收顺序,数据的封装规则。 通俗解释:描述双方发送和接收的每个字节是按照什么规则。 二、TCP/IP体系的常用协议 (一)应用层 HTTP:超文本协议;指的是用来传输文本网页的协议&#…...
【折线图 Line】——12
🌟 解锁数据可视化的魔法钥匙 —— pyecharts实战指南 🌟 在这个数据为王的时代,每一次点击、每一次交易、每一份报告背后都隐藏着无尽的故事与洞察。但你是否曾苦恼于如何将这些冰冷的数据转化为直观、吸引人的视觉盛宴? 🔥 欢迎来到《pyecharts图形绘制大师班》 �…...