WebSocket与HTTP协议究竟有何不同?FastAPI如何让长连接变得如此简单?


扫描二维码
关注或者微信搜一搜:编程智域 前端至全栈交流与成长
发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/
第一章:WebSocket协议基础与FastAPI定位
1.1 WebSocket与HTTP协议核心差异
通过对比传统HTTP协议与WebSocket协议的核心特性,我们可以从以下维度理解二者的差异:
| 对比维度 | HTTP 1.1 | WebSocket |
|---|---|---|
| 通信模式 | 请求-响应模式(半双工) | 全双工双向通信 |
| 连接持久性 | 短连接(默认关闭) | 长连接(保持激活状态) |
| 数据传输效率 | 每次请求需携带完整Header | 初始握手后仅传输有效数据 |
| 数据格式 | 基于文本(支持二进制分帧) | 原生支持二进制帧和文本帧 |
| 服务端推送能力 | 依赖长轮询/SSE实现 | 原生支持服务端主动推送 |
participant Client
participant Server
Client->>Server: HTTP Request
Server-->>Client: HTTP Response
Note over Client,Server: Traditional HTTP (Request/Response Model)
Client->>Server: WebSocket Handshake Request
Server-->>Client: WebSocket Handshake Response
Client->Server: WebSocket Connection Established
loop Continuous Communication
Client-->>Server: Send Data
Server-->>Client: Receive Data
Server-->>Client: Send Data
Client-->>Server: Receive Data
end
Note over Client,Server: WebSockets (Full-Duplex Communication)
类比理解:HTTP协议如同收发纸质信件(每次通信需重新建立连接),WebSocket则像是电话通话(建立连接后可随时双向对话)
1.2 FastAPI的WebSocket原生支持
1.2.1 基础路由配置
FastAPI通过简洁的装饰器语法支持WebSocket端点定义:
from fastapi import FastAPI, WebSocket
from pydantic import BaseModel
app = FastAPI()
class MessageModel(BaseModel):
content: str
type: str = "text"
@app.websocket("/ws-chat")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
try:
while True:
data = await websocket.receive_json()
message = MessageModel(**data) # Pydantic数据验证
await websocket.send_json({"status": "received", "data": message.dict()})
except Exception as e:
await websocket.close(code=1011, reason=str(e))
(使用环境:Python 3.8+, fastapi0.109.0, uvicorn0.27.0, pydantic==2.6.4)
1.2.2 关键技术特性
- 异步处理架构:基于ASGI标准支持高并发连接
- 自动协议升级:自动处理HTTP到WebSocket的协议切换
- 数据验证集成:结合Pydantic实现强类型数据校验
- 连接生命周期管理:提供accept()/receive()/send()/close()全流程控制
1.3 长连接应用场景实践
1.3.1 实时聊天系统
# 存储活跃连接的全局字典
active_connections = {}
@app.websocket("/chat/{room_id}")
async def chat_room(websocket: WebSocket, room_id: str):
await websocket.accept()
active_connections[websocket] = room_id
try:
while True:
message = await websocket.receive_text()
# 广播消息到同房间用户
for conn, r_id in active_connections.items():
if r_id == room_id:
await conn.send_text(f"Room {room_id}: {message}")
finally:
del active_connections[websocket]
1.3.2 实时数据监控
from datetime import datetime
@app.websocket("/system-monitor")
async def monitor_feed(websocket: WebSocket):
await websocket.accept()
while True:
# 模拟获取系统指标
metrics = {
"timestamp": datetime.now().isoformat(),
"cpu_load": os.getloadavg()[0],
"memory_usage": psutil.virtual_memory().percent
}
await websocket.send_json(metrics)
await asyncio.sleep(1) # 每秒推送一次
1.3.3 实时通知推送
import redis
from fastapi import BackgroundTasks
redis_conn = redis.Redis(host='localhost', port=6379)
async def notification_listener(websocket: WebSocket, user_id: str):
pubsub = redis_conn.pubsub()
await pubsub.subscribe(f"notifications:{user_id}")
while True:
message = await pubsub.get_message(ignore_subscribe_messages=True)
if message:
await websocket.send_text(message['data'])
@app.websocket("/notifications")
async def notification_endpoint(websocket: WebSocket, user_id: str):
await websocket.accept()
background_tasks = BackgroundTasks()
background_tasks.add_task(notification_listener, websocket, user_id)
await background_tasks()
课后Quiz
Q1:WebSocket连接建立过程中,客户端首先发送的特殊HTTP Header是什么?
A) Upgrade: websocket
B) Connection: keep-alive
C) Accept: text/websocket
D) Protocol: ws
正确答案:A
解析:WebSocket握手阶段要求客户端发送Upgrade: websocket头,表示请求协议升级
常见报错解决方案
错误现象:
WebSocket连接失败 400 Bad Request
排查步骤:
- 检查客户端是否使用
ws://或wss://协议前缀 - 验证服务器端是否正确定义WebSocket路由
- 确认Nginx等反向代理配置包含以下参数:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
- 使用浏览器开发者工具查看WebSocket握手阶段的网络请求详情
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
,阅读完整的文章:WebSocket与HTTP协议究竟有何不同?FastAPI如何让长连接变得如此简单?
往期文章归档:
- FastAPI如何玩转安全防护,让黑客望而却步?
- 如何用三层防护体系打造坚不可摧的 API 安全堡垒? - cmdragon's Blog
- FastAPI安全加固:密钥轮换、限流策略与安全头部如何实现三重防护? - cmdragon's Blog
- 如何在FastAPI中巧妙玩转数据脱敏,让敏感信息安全无忧? - cmdragon's Blog
- RBAC权限模型如何让API访问控制既安全又灵活? - cmdragon's Blog
- FastAPI中的敏感数据如何在不泄露的情况下翩翩起舞?
- FastAPI安全认证的终极秘籍:OAuth2与JWT如何完美融合? - cmdragon's Blog
- 如何在FastAPI中打造坚不可摧的Web安全防线? - cmdragon's Blog
- 如何用 FastAPI 和 RBAC 打造坚不可摧的安全堡垒? - cmdragon's Blog
- FastAPI权限配置:你的系统真的安全吗? - cmdragon's Blog
- FastAPI权限缓存:你的性能瓶颈是否藏在这只“看不见的手”里? | cmdragon's Blog
- FastAPI日志审计:你的权限系统是否真的安全无虞? | cmdragon's Blog
- 如何在FastAPI中打造坚不可摧的安全防线? | cmdragon's Blog
- 如何在FastAPI中实现权限隔离并让用户乖乖听话? | cmdragon's Blog
- 如何在FastAPI中玩转权限控制与测试,让代码安全又优雅? | cmdragon's Blog
- 如何在FastAPI中打造一个既安全又灵活的权限管理系统? | cmdragon's Blog
- FastAPI访问令牌的权限声明与作用域管理:你的API安全真的无懈可击吗? | cmdragon's Blog
- 如何在FastAPI中构建一个既安全又灵活的多层级权限系统? | cmdragon's Blog
- FastAPI如何用角色权限让Web应用安全又灵活? | cmdragon's Blog
- FastAPI权限验证依赖项究竟藏着什么秘密? | cmdragon's Blog
- 如何用FastAPI和Tortoise-ORM打造一个既高效又灵活的角色管理系统? | cmdragon's Blog
- JWT令牌如何在FastAPI中实现安全又高效的生成与验证? | cmdragon's Blog
- 你的密码存储方式是否在向黑客招手? | cmdragon's Blog
- 如何在FastAPI中轻松实现OAuth2认证并保护你的API? | cmdragon's Blog
- FastAPI安全机制:从OAuth2到JWT的魔法通关秘籍 | cmdragon's Blog
- FastAPI认证系统:从零到令牌大师的奇幻之旅 | cmdragon's Blog
- FastAPI安全异常处理:从401到422的奇妙冒险 | cmdragon's Blog
- FastAPI权限迷宫:RBAC与多层级依赖的魔法通关秘籍 | cmdragon's Blog
- JWT令牌:从身份证到代码防伪的奇妙之旅 | cmdragon's Blog
- FastAPI安全认证:从密码到令牌的魔法之旅 | cmdragon's Blog
- 密码哈希:Bcrypt的魔法与盐值的秘密 | cmdragon's Blog
- 用户认证的魔法配方:从模型设计到密码安全的奇幻之旅 | cmdragon's Blog
- FastAPI安全门神:OAuth2PasswordBearer的奇妙冒险 | cmdragon's Blog
- OAuth2密码模式:信任的甜蜜陷阱与安全指南 | cmdragon's Blog
- API安全大揭秘:认证与授权的双面舞会 | cmdragon's Blog
- 异步日志监控:FastAPI与MongoDB的高效整合之道 | cmdragon's Blog
免费好用的热门在线工具
- CMDragon 在线工具 - 高级AI工具箱与开发者套件 | 免费好用的在线工具
- 应用商店 - 发现1000+提升效率与开发的AI工具和实用程序 | 免费好用的在线工具
- CMDragon 更新日志 - 最新更新、功能与改进 | 免费好用的在线工具
- 支持我们 - 成为赞助者 | 免费好用的在线工具
- AI文本生成图像 - 应用商店 | 免费好用的在线工具
- 临时邮箱 - 应用商店 | 免费好用的在线工具
- 二维码解析器 - 应用商店 | 免费好用的在线工具
- 文本转思维导图 - 应用商店 | 免费好用的在线工具
- 正则表达式可视化工具 - 应用商店 | 免费好用的在线工具
- 文件隐写工具 - 应用商店 | 免费好用的在线工具
- IPTV 频道探索器 - 应用商店 | 免费好用的在线工具
- 快传 - 应用商店 | 免费好用的在线工具
- 随机抽奖工具 - 应用商店 | 免费好用的在线工具
- 动漫场景查找器 - 应用商店 | 免费好用的在线工具
- 时间工具箱 - 应用商店 | 免费好用的在线工具
- 网速测试 - 应用商店 | 免费好用的在线工具
- AI 智能抠图工具 - 应用商店 | 免费好用的在线工具
- 背景替换工具 - 应用商店 | 免费好用的在线工具
- 艺术二维码生成器 - 应用商店 | 免费好用的在线工具
- Open Graph 元标签生成器 - 应用商店 | 免费好用的在线工具
- 图像对比工具 - 应用商店 | 免费好用的在线工具
- 图片压缩专业版 - 应用商店 | 免费好用的在线工具
- 密码生成器 - 应用商店 | 免费好用的在线工具
- SVG优化器 - 应用商店 | 免费好用的在线工具
- 调色板生成器 - 应用商店 | 免费好用的在线工具
- 在线节拍器 - 应用商店 | 免费好用的在线工具
- IP归属地查询 - 应用商店 | 免费好用的在线工具
- CSS网格布局生成器 - 应用商店 | 免费好用的在线工具
- 邮箱验证工具 - 应用商店 | 免费好用的在线工具
- 书法练习字帖 - 应用商店 | 免费好用的在线工具
- 金融计算器套件 - 应用商店 | 免费好用的在线工具
- 中国亲戚关系计算器 - 应用商店 | 免费好用的在线工具
- Protocol Buffer 工具箱 - 应用商店 | 免费好用的在线工具
- IP归属地查询 - 应用商店 | 免费好用的在线工具
- 图片无损放大 - 应用商店 | 免费好用的在线工具
- 文本比较工具 - 应用商店 | 免费好用的在线工具
- IP批量查询工具 - 应用商店 | 免费好用的在线工具
- 域名查询工具 - 应用商店 | 免费好用的在线工具
- DNS工具箱 - 应用商店 | 免费好用的在线工具
- 网站图标生成器 - 应用商店 | 免费好用的在线工具
- XML Sitemap
WebSocket与HTTP协议究竟有何不同?FastAPI如何让长连接变得如此简单?的更多相关文章
- HTTP长连接、短连接究竟
HTTP长连接.短连接究竟是什么? 1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用I ...
- HTTP长连接、短连接究竟是什么?
1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议. IP协议主要解决网络路由和寻址 ...
- http协议及长连接和短连接
1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议. IP协议主要解决网络路由和寻址 ...
- WebSocket数据包协议详解
其实我一直想不明白HTML5包装个应用层办议作为Socket通过基础目的是为了什么,其实直接支持Socket tcp相对来说更加简单灵活.既然标准已经制定而浏览器也支持那对于我们开发者来说只能用的分. ...
- springboot之websocket,STOMP协议
一.WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在 ...
- WebSocket和HTTP协议的区别
HTTP: 1,无状态协议. 2,短连接.(Ajax轮询方式或Long poll方式实现“持久连接”状态) 2,被动型. 客户端请求->服务器端响应.服务端不能主动联系客户端,只能有客户端发 ...
- 浅谈Websocket、Ajax轮询和长连接(long pull)
最近看到了一些介绍Websocket的文章,觉得挺有用,所以在这里将自己的对其三者的理解记录一下. 1.什么是Websocket Websocket是HTML5中提出的新的协议,注意,这里是协议,可以 ...
- HTTP长连接和短连接 + Websocket
HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问题,T ...
- 微信小程序中如何使用WebSocket实现长连接(含完整源码)
本文由腾讯云技术团队原创,感谢作者的分享. 1.前言 微信小程序提供了一套在微信上运行小程序的解决方案,有比较完整的框架.组件以及 API,在这个平台上面的想象空间很大.腾讯云研究了一番之后,发现 ...
- Python WebSocket长连接心跳与短连接
python websocket 安装 pip install websocket-client 先来看一下,长连接调用方式: ws = websocket.WebSocketApp("ws ...
随机推荐
- 【Maven】POM基本概念
目前的技术在开发中存在的问题: 一个项目就是一个工程 如果项目非常庞大,就不适合继续使用 package 来划分模块.最好是每一个模块对应一个工程,利于分工协作. 借助于 Maven 就可以将一个项目 ...
- C# Socket 使用教程
我在学习Socket时,总是感觉文章看不懂,视频又好长,所以留下这篇学习笔记,权当做同学间学习参考,与个人回顾吧. 简介 Socket(译做:管道/套接字)是一个便捷的类 用于封装通信时所涉及到复杂底 ...
- 记一个.NET AOT交叉编译时的坑
记一个.NET AOT交叉编译时的坑 背景: 使用.NET9开发的Avalonia项目需要部署到Linux-arm64 踩坑: 根据官方AOT交叉编译文档配置后执行打包 dotnet publish ...
- 基于Zookeeper实现调度任务选主及心跳检测
在微服务架构中使用ZooKeeper实现分布式任务调度选主,并确保Follower节点能实时监控Master状态并及时触发重新选举,可以通过以下方案实现: 一.核心设计原理 1. ZooKeeper特 ...
- python,url请求失败重新请求的方法(try、except 应用)
爬虫请求链接,有时候会出现请求失败或者等待时间很长的情况,用下面的方法可以一定程度的解决这个问题 url='https://cl.xxxx.xyz/'+url try: response = requ ...
- 【自用】MySQL数据库基本操作
docker 中下载 mysql docker pull mysql 启动 docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12 ...
- C#访问注册表
注册表 .wiz-editor-body .wiz-code-container { position: relative; padding: 8px 0; margin: 5px 0; text-i ...
- GSLibrary平台本地搭建(windows)
一.安装配置数据库 https://dev.mysql.com/downloads/windows/installer/5.7.html 创建GSLibrary数据库 mysql -uroot -p ...
- smail log插桩(模板)
即插即用 后面都用hook了,但是为了方便,还是分享下吧 Log const-string v0, "MYTAG" const-string v1, "Message&q ...
- 痞子衡嵌入式:不处理i.MXRT1064片内Flash的RESET#引脚可能会导致无法启动或程序跑飞
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1064片内Flash的RESET#引脚对程序启动和运行的影响. 上一篇文章 <i.MXRT1024/1064片内4M ...