扫描二维码

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

发现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. CSS文本超出省略

    语法: text-overflow:clip|ellipsis|"任意字符" <!DOCTYPE html> <html> <head> < ...

  2. fiddler抓包配置

    一.fiddler配置 打开tools-options 1.设置general,勾选对应选项 2.设置HTTPS,勾选Decrypt HTTPS traffic时,首次使用如果没有下载过fiddler ...

  3. wpf 代码判断当前是否在设计模式,兼容没有UI线程的限制

    /// <summary> /// 当前是否处于设计模式 /// </summary> bool IsInDesignMode { get { return (bool)Des ...

  4. hadoop部署安装(二)hdfs

    2.1 解压Hadop包 2.2 配置hadoop-env.sh文件 [root@master ~]# cd /usr/local [root@master local]# tar xf hadoop ...

  5. 82.7K star!大气炫酷UI开源项目,超级火!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 shadcn/ui 是一款基于 Radix UI 和 Tailwind CSS 构建的现代化 ...

  6. 【大前端攻城狮之路】用 Typewriter-SSE 实现打字机效果

    在现代 Web 开发中,实现动态文本渲染的需求日益增多.无论是聊天应用.实时通知,还是交互式界面,打字机风格的文本渲染都能显著提升用户体验.最近新写了一个开源的 NPM 包--Typewriter-S ...

  7. 45分钟从零搭建私有MaaS平台和生产级的Qwen3模型服务

    今天凌晨,阿里通义团队正式发布了 Qwen3,涵盖六款 Dense 模型(0.6B.1.7B.4B.8B.14B.32B)和两款 MoE 模型(30B-A3B 和 235B-A22B).其中的旗舰模型 ...

  8. 【HUST】网安|计算机网络实验|实验三 华为ENSP配置

    我没有配置无线AP和AC,使用静态路由. 拓扑图文件链接:Gitee传送门. 在安装了ensp的情况下,解压即可使用. 1. 实验检查要求 2. 实验结果 2.1 我的拓扑图 2.2 我的IP地址划分 ...

  9. SQL 日常练习 (二十)

    也只是尽快搬完这快一个月 sql 的砖, 准备要来整新学习模块了, 因此, 正好趁着五一, 加波速. 也会一直坚守和追求, 学无止境, 气有浩然. 每次都会说, 这是一种精神的传承,而我想的是, 不仅 ...

  10. 卷积神经网络CNN 初识

    Network 之前将人工神经网络的 BP算法给详细推导了2遍, 算是对神经网络有了一个初步的认识, 当然, 重点还是算法的推导, 从数学的角度看, 就是多元复合函数求偏导, 应用链式法则 而已, 思 ...