websocket学习手册及python实现简单的聊天室
概述
- WebSocket 是一种网络通信协议,允许在单个 TCP 连接上进行全双工通信。它最核心的优势就在于实现了持久连接,实现了实时的数据传输。
- HTTP 协议有一个很大的缺点,通信只能由客户端发起,服务器返回响应后连接就会关闭,如果我们想要知道任务连续的状态变化的话,就需要通过轮询来获取状态,这种方法的效率就会非常低。
- WebSocket需要维护连接,这需要额外的开销,包括内存和CPU,没有必要需求无需使用
- WebSocket协议是一种可靠的、高效的、双向的、持久的通信协议,支持文本和二进制数据。
如何建立连接
+---------+ +---------+
| Client | | Server |
+---------+ +---------+| || 1. HTTP GET (Upgrade request) ||---------------------------------->|| || 2. HTTP 101 Switching Protocols ||<----------------------------------|| || 3. WebSocket Connection Established ||<---------------------------------->|| |
WebSocket 连接的建立过程基于 HTTP 协议,我使用postman建立一个连接,打开握手详情,可以看到这些信息:


-
首先,客户端发送一个 HTTP GET 请求,包含以下关键头信息:
-
Upgrade: websocket:表示希望升级到 WebSocket 协议。 -
Connection: Upgrade:表示要求升级连接。 -
Sec-WebSocket-Key:一个随机生成的 Base64 编码字符串,用于验证服务器。 -
Sec-WebSocket-Version:指定 WebSocket 协议版本(通常为 13)。
-
-
服务器检查请求头,如果支持 WebSocket,返回 HTTP 101 状态码(Switching Protocols),并包含以下头信息:
Upgrade: websocket:确认升级到 WebSocket 协议。Connection: Upgrade:确认连接升级。Sec-WebSocket-Accept:基于客户端的Sec-WebSocket-Key计算的值,用于验证。
关于wss和ws
ws 和 wss 是 WebSocket 协议的两种不同形式,主要区别在于 安全性 和 数据传输方式。
ws | wss | |
|---|---|---|
| 特性 | 非加密 | 加密 |
| 协议 | 普通 TCP | 基于 TLS/SSL 的 TCP |
| 安全性 | 数据明文传输,不安全 | 数据加密传输,安全 |
| 适用场景 | 内部网络、开发环境 | 生产环境、敏感数据传输 |
| 默认端口 | 80 | 443 |
| URL 前缀 | ws:// | wss:// |
简单实现
from fastapi import FastAPI, APIRouter, WebSocket, WebSocketDisconnectapp = FastAPI()
router = APIRouter(prefix='/demo', tags=['demo'])# WebSocket 端点
@router.websocket("/ws/{user_id}")
async def websocket_endpoint(websocket: WebSocket, user_id: str):# 接受客户端连接await websocket.accept()while True:try:# 接收客户端发送的消息data = await websocket.receive_text()# 打印接收到的消息print(f"Received message: {data}")# 将消息原样发送回客户端await websocket.send_text(f"Echo: {data}")except Exception as e:print(f"Error: {e}")breakapp.include_router(router)
实战-实现一个聊天室
import jsonfrom fastapi import FastAPI, APIRouter, WebSocket, WebSocketDisconnectapp = FastAPI()
router = APIRouter(prefix='/demo', tags=['demo'])class ConnectionManager:def __init__(self):self.active_connections: dict[str, WebSocket] = {}async def connect(self, websocket: WebSocket, user_id: str):await websocket.accept()self.active_connections[user_id] = websocketdef disconnect(self, user_id: str):if user_id in self.active_connections:del self.active_connections[user_id]async def send_message(self, message: str, user_id: str, target_user: str):# 向目标用户发送消息if websocket := self.active_connections.get(target_user):data = json.dumps({"message": message, "from_user": user_id})await websocket.send_text(data)manager = ConnectionManager()# WebSocket 端点
@router.websocket("/ws/{user_id}")
async def websocket_endpoint(websocket: WebSocket, user_id: str):await manager.connect(websocket, user_id)try:while True:data = await websocket.receive_text()data = json.loads(data)# 接收到消息后,向目标用户发送消息await manager.send_message(data.get("message"), user_id, data.get("target_user"))except WebSocketDisconnect:manager.disconnect(user_id)print(f"用户 {user_id} 断开连接")app.include_router(router)
这里使用了user_id作为标志,根据用户id向指定的对象发送消息,可以看到8888用户给6666用户发送了个hello,而6666用户也接收到了相应的消息


相关文章:
websocket学习手册及python实现简单的聊天室
概述 WebSocket 是一种网络通信协议,允许在单个 TCP 连接上进行全双工通信。它最核心的优势就在于实现了持久连接,实现了实时的数据传输。HTTP 协议有一个很大的缺点,通信只能由客户端发起,服务器返回响应后连接就会关闭…...
SpringMVC (二)请求处理
目录 章节简介 一 请求处理(初级) eg:请求头 二 请求处理(进阶) eg:请求体 三 获取请求头 四 获取Cookie 五 级联封装 六 使用RequestBoby封装JSON对象 七 文件的上传 八 获取整个请求 HttpEntity 九 原生请求 Spring…...
Android (Kotlin) 高版本 DownloadManager 封装工具类,支持 APK 断点续传与自动安装
以下是一个针对 Android 高版本的 DownloadManager 封装工具类,支持 断点续传 和 自动安装 APK 功能。该工具类兼容 Android 10 及以上版本的文件存储策略,并适配了 FileProvider 和未知来源应用安装权限。 工具类:DownloadUtils import and…...
深入探索Android Bitmap:从原理到实战
一、Bitmap 是什么 在 Android 开发中,Bitmap 是极为重要的基石。简单来说,Bitmap 代表位图,是图片在内存里的具体呈现形式 ,任何诸如 JPEG、PNG、WEBP 等格式的图片,一旦被加载到内存中,就会以 Bitmap 对象的形式存在。从原理上看,Bitmap 本质是像素点的集合,若其宽度…...
详细介绍 SetWindowPos() 函数
书籍:《Visual C 2017从入门到精通》的2.3.8 Win32控件编程 环境:visual studio 2022 内容:【例2.29】模态对话框 说明:以下内容大部分来自腾讯元宝。 1. 函数功能与用途 SetWindowPos() 是 Windows API 中用于动态调整窗口…...
1.6、Java继承、构造方法、数组
子类可以增加字段、增加方法或覆盖父类方法,但继承不会删除任何字段和方法不恰当认为super 同 this 引用是类似的概念,其实super不是一个对象的引用,不能将值super赋给另一个对象变量,super只是一个指示 编译器调用父类方法的特殊…...
通义万相 2.1 与蓝耘智算平台的深度协同,挖掘 AIGC 无限潜力并释放巨大未来价值
我的个人主页 我的专栏: 人工智能领域、java-数据结构、Javase、C语言,希望能帮助到大家!!! 点赞👍收藏❤ 引言:AIGC 浪潮下的新机遇 在当今数字化飞速发展的时代,人工智能生成内容&…...
Spring Boot项目中成功集成了JWT
JWT 原理解释 什么是 JWT? JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在网络应用环境间安全地将信息作为JSON对象传输。JWT通常用于身份验证和信息交换。 JWT 的结构 JWT由三部分组成ÿ…...
DeepSeek 3FS集群化部署临时笔记
DeepSeek 3FS集群化部署临时笔记 一、3FS集群化部署1、环境介绍2、对应的软件包安装3、编译4、部署4.1 部署monitor_collector_mainStep 2: Admin clientStep 3: Mgmtd serviceStep 4: Meta serviceStep 5: Storage serviceStep 6: Create admin user, storage targets and cha…...
专题|Python贝叶斯金融数据应用实例合集:随机波动率SV模型、逻辑回归、参数更新、绩效比较BEST分析亚马逊股票、普尔指数...
原文链接:https://tecdat.cn/?p41020 本专题合集系统梳理了贝叶斯方法在金融数据分析与分类建模中的前沿应用。合集聚焦于PyMC3概率编程框架,深度探讨了共轭先验参数更新、贝叶斯逻辑回归、贝叶斯夏普比率等核心算法在实际场景中的落地实践(…...
RocketMQ企业应用篇
在现代企业级应用中,分布式消息队列系统如RocketMQ发挥着至关重要的作用。本文将深入探讨RocketMQ在电商和物联网场景中的应用,结合实际案例和代码示例,展示如何利用RocketMQ解决企业级应用中的关键问题。 一、电商场景应用 1. 秒杀抢购解决…...
vue-常用指令 | 常用指令的修饰符
目录 什么是vue指令 v-cloak v-text v-html v-pre v-show /v-if v-else/v-else-if v-on v-bind v-for v-model 常用指令的修饰符 v-model 指令修饰符 事件修饰符 按键修饰符 什么是vue指令 指令就是带有 v- 前缀 的特殊 属性,不同的属性对应不…...
Git提交前时间检查
为了防止在本地看日志的时候,由于本地时间被修改,导致日志的时间存在非正确时间。通过以下脚本在提交前进行时间验证,只有是正确的时间才可以提交。 使用方法如下: 复制如下脚本,命名为 pre-commit ,放到 …...
Linux调度器 --- 负载均衡的存在的问题
文章目录 前言一、简介二、Linux 调度器2.1 在单核系统上,CFS 非常简单2.2 在多核系统上,CFS 变得非常复杂2.2.1 负载均衡算法2.2.2 优化措施 三、Linux调度器负载均衡的存在的问题3.1 组负载不均衡问题(Group Imbalance Bug)3.2 …...
从零开始用AI开发游戏(三)背景故事
《迷域回响》背景故事 第一章:失落的符文纪元 在远古的“艾瑟兰”大陆,掌握空间魔法的「筑界者文明」曾建造了连通万界的回响迷宫——这座迷宫既是试炼场,也是囚笼。文明巅峰时期,筑界者将禁忌知识刻入虚空符文,嵌于…...
IXTUR气控永磁铁:以高精度气控和稳定磁场,为机器人应用提供稳定抓取力
在现代工业生产和物流领域,物料的抓取与搬运是影响生产效率和成本控制的重要环节。传统夹爪在面对不同材质、形状和重量的物体时,常常存在适应性差、抓取不稳定、操作复杂等问题,导致生产流程中频繁出现停机调整,增加了人工干预成…...
硬件驱动——51单片机:寄存器、LED、动态数码管
目录 一、51单片机 1.寄存器 二、LED点灯 1.原理 2.封装函数 3.顺序点灯 4.特定位点灯 三、动态数码管 1.原理 2.封装函数 3.0~9跳变 4.顺序移位0~9跳变 一、51单片机 1.寄存器 51单片机共40个引脚,其中P0,P1,P2,P3是四个有8引脚的寄存器࿰…...
2025 香港 Web3 嘉年华:全球 Web3 生态的年度盛会
自 2023 年首届香港 Web3 嘉年华成功举办以来,这一盛会已成为全球 Web3 领域规模最大、影响力最深远的行业活动之一。2025 年 4 月 6 日至 9 日,第三届香港 Web3 嘉年华将在香港盛大举行。本届活动由万向区块链实验室与 HashKey Group 联合主办、W3ME 承…...
【MySQL】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法
在DQL的基础查询中,我们已经学过了多表查询的一种:联合查询(union)。本文我们将系统的讲解多表查询。 笛卡尔积现象 首先,我们想要查询emp表和stu表两个表,按照我们之前的知识栈,我们直接使用…...
Leetcode-132.Palindrome Partitioning II [C++][Java]
目录 一、题目描述 二、解题思路 【C】 【Java】 Leetcode-132.Palindrome Partitioning IIhttps://leetcode.com/problems/palindrome-partitioning-ii/description/132. 分割回文串 II - 力扣(LeetCode)132. 分割回文串 II - 给你一个字符串 s&…...
在 macOS 上优化 Vim 用于开发
简介 这篇指南将带你通过一系列步骤,如何在 macOS 上优化 Vim,使其具备 代码补全、语法高亮、代码格式化、代码片段管理、目录树等功能。此外,我们还会解决在安装过程中可能遇到的常见错误。 1. 安装必备工具 在开始 Vim 配置之前ÿ…...
SOME/IP-SD -- 协议英文原文讲解8
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.4.4 S…...
【Agent实战】货物上架位置推荐助手(RAG方式+结构化prompt(CoT)+API工具结合ChatGPT4o能力Agent项目实践)
本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 结论 效果图示 1.prompt 2. API工具封…...
Spring Boot使用线程池创建多线程
在 Spring Boot 2 中,可以使用 Autowired 注入 线程池(ThreadPoolTaskExecutor 或 ExecutorService),从而管理线程的创建和执行。以下是使用 Autowired 方式注入线程池的完整示例。 1. 通过 Autowired 注入 ThreadPoolTaskExecuto…...
PyTorch 深度学习实战(11):强化学习与深度 Q 网络(DQN)
在之前的文章中,我们介绍了神经网络、卷积神经网络(CNN)、循环神经网络(RNN)、Transformer 等多种深度学习模型,并应用于图像分类、文本分类、时间序列预测等任务。本文将介绍强化学习的基本概念࿰…...
在Eclipse 中使用 MyBatis 进行开发,通常需要以下步骤:
在Eclipse 中使用 MyBatis 进行开发,通常需要以下步骤: 1. 创建 Maven 项目 首先,在 Eclipse 中创建一个 Maven 项目。如果你还没有安装 Maven 插件,可以通过 Eclipse Marketplace 安装 Maven 插件。 打开 Eclipse,选…...
Python学习第十九天
Django-分页 后端分页 Django提供了Paginator类来实现后端分页。Paginator类可以将一个查询集(QuerySet)分成多个页面,每个页面包含指定数量的对象。 from django.shortcuts import render, redirect, get_object_or_404 from .models impo…...
Adobe Premiere Pro2023配置要求
Windows 系统 最低配置 处理器:Intel 第六代或更新版本的 CPU,或 AMD Ryzen™ 1000 系列或更新版本的 CPU,需要支持 Advanced Vector Extensions 2(AVX2)。操作系统:Windows 10(64 位ÿ…...
面试求助:接口测试用例设计主要考虑哪些方面?
一、基础功能验证 1. 正常场景覆盖 关键点:验证接口在合法输入下的正确响应(状态码、数据结构、业务逻辑)。 案例: json 复制 // 用户登录接口 输入:{"username": "合法用户", "password…...
C语言——变量与常量
C语言中的变量与常量:简洁易懂的指南 在C语言编程中,变量和常量是最基本的概念之一。理解它们的区别和使用方法对于编写高效、可维护的代码至关重要。本文将详细介绍C语言中的变量和常量,并通过图表和代码示例帮助你更好地理解。 目录 什么…...
