扫描二维码

关注或者微信搜一搜:编程智域 前端至全栈交流与成长

发现1000+提升效率与开发的AI工具和实用程序https://tools.cmdragon.cn/

第一章:WebSocket协议基础与FastAPI定位

1.1 WebSocket与HTTP协议核心差异

通过对比传统HTTP协议与WebSocket协议的核心特性,我们可以从以下维度理解二者的差异:

对比维度 HTTP 1.1 WebSocket
通信模式 请求-响应模式(半双工) 全双工双向通信
连接持久性 短连接(默认关闭) 长连接(保持激活状态)
数据传输效率 每次请求需携带完整Header 初始握手后仅传输有效数据
数据格式 基于文本(支持二进制分帧) 原生支持二进制帧和文本帧
服务端推送能力 依赖长轮询/SSE实现 原生支持服务端主动推送
sequenceDiagram
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

排查步骤

  1. 检查客户端是否使用ws://wss://协议前缀
  2. 验证服务器端是否正确定义WebSocket路由
  3. 确认Nginx等反向代理配置包含以下参数:
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  4. 使用浏览器开发者工具查看WebSocket握手阶段的网络请求详情

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

,阅读完整的文章:WebSocket与HTTP协议究竟有何不同?FastAPI如何让长连接变得如此简单?

往期文章归档:

免费好用的热门在线工具

WebSocket与HTTP协议究竟有何不同?FastAPI如何让长连接变得如此简单?的更多相关文章

  1. HTTP长连接、短连接究竟

    HTTP长连接.短连接究竟是什么?   1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用I ...

  2. HTTP长连接、短连接究竟是什么?

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议. IP协议主要解决网络路由和寻址 ...

  3. http协议及长连接和短连接

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议. IP协议主要解决网络路由和寻址 ...

  4. WebSocket数据包协议详解

    其实我一直想不明白HTML5包装个应用层办议作为Socket通过基础目的是为了什么,其实直接支持Socket tcp相对来说更加简单灵活.既然标准已经制定而浏览器也支持那对于我们开发者来说只能用的分. ...

  5. springboot之websocket,STOMP协议

    一.WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在 ...

  6. WebSocket和HTTP协议的区别

    HTTP: 1,无状态协议. 2,短连接.(Ajax轮询方式或Long  poll方式实现“持久连接”状态) 2,被动型.  客户端请求->服务器端响应.服务端不能主动联系客户端,只能有客户端发 ...

  7. 浅谈Websocket、Ajax轮询和长连接(long pull)

    最近看到了一些介绍Websocket的文章,觉得挺有用,所以在这里将自己的对其三者的理解记录一下. 1.什么是Websocket Websocket是HTML5中提出的新的协议,注意,这里是协议,可以 ...

  8. HTTP长连接和短连接 + Websocket

    HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问题,T ...

  9. 微信小程序中如何使用WebSocket实现长连接(含完整源码)

    本文由腾讯云技术团队原创,感谢作者的分享. 1.前言   微信小程序提供了一套在微信上运行小程序的解决方案,有比较完整的框架.组件以及 API,在这个平台上面的想象空间很大.腾讯云研究了一番之后,发现 ...

  10. Python WebSocket长连接心跳与短连接

    python websocket 安装 pip install websocket-client 先来看一下,长连接调用方式: ws = websocket.WebSocketApp("ws ...

随机推荐

  1. SQL Server 2008语句大全完整版

    --======================== --设置内存选项 --======================== --设置 min server memory 配置项 EXEC sp_co ...

  2. C#连接小智服务器并将音频解码播放过程记录

    前言 最近小智很火,本文记录C#连接小智服务器并将音频解码播放的过程,希望能帮助到对此感兴趣的开发者. 如果没有ESP-32也想体验小智AI,那么这两个项目很适合你. 1.https://github ...

  3. FastAPI 核心安全功能与模板渲染的完整示:登录、CSRF、JWT、会话、认证和缓存功能

    以下是一个整合 FastAPI 核心安全功能与模板渲染的完整示例,基于多个技术文档的最佳实践,包含登录.CSRF.JWT.会话.认证和缓存功能: from datetime import dateti ...

  4. 使用 AutoGen Studio 打造你的私有团队

    AI Agent 无疑是今年最火爆的概念,从科技巨头的战略布局到创业公司的创新产品,AI 智能体正在重塑我们与机器交互的方式.无论是自动化任务.个性化服务,还是复杂问题的协同解决,AI Agent 都 ...

  5. C++宏定义中可变参数列表__VA_ARGS__ 及 QT 提供的宏 QT_OVERLOADED_MACRO

    1. 基本用法 VA_ARGS 是 C/C++ 中的预定义宏,用于在宏定义中表示可变参数列表(Variadic Arguments),需与省略号 ... 配合使用.其核心作用是将宏调用中的可变参数原样 ...

  6. eolink对数据进行四舍五入处理

    下图"BalanceAmount"返回值显示小数点2位以后的值,这样就与预计匹配值不等导致脚本错误 对这个值进行四舍五入处理,比如返回值变成整数 var num = eo.env. ...

  7. 根据返回值,判断是否执行下一步的方法(Run Keyword And Return Status指令的使用)

    场景分析: 上图"通用模版测试"内容 满足,如果当前页面存在这条数据,即结束执行本条用例,自动执行下一条.如果没有,则调用新建模版关键字,执行新建模版. 脚本如下 1配置运费模版 ...

  8. DPDI(Dispatch PDI)kettle调度管理平台之介入前后的对比剖析

    DPDI(Dispatch PDI)kettle调度管理平台 --介入前后的对比剖析 引言 在数据处理领域,Kettle(Pentaho Data Integration)作为一款广受欢迎的开源ETL ...

  9. git提示fatal: Authentication failed for但是不进入重新登录的流程,也死活不弹窗的解决办法,不用找证书删

    问题: git提交代码输错了密码,提示 fatal: Authentication failed for xxx 但是不进入重新登录的流程,也死活不弹窗. 感觉git的这个设计真的很沙雕.网上说删证书 ...

  10. RabbitMQ发布确认及备份交换机

    RabbitMQ发布确认及备份交换机 可以通过设置RabbitMQ的发布确认和失败回退功能来确认消息是否成功发布. 也可以为交换机设置备份交换机,来接收不可路由的消息. demo结构 配置及实现 ap ...