13 WebSocket 基础原理与入门案例
WebSocket 基础原理与入门案例
关联:索引
要解决的问题
- 为什么实时通信场景(如聊天、设备监控)不适合用 HTTP,WebSocket 解决了什么核心痛点
- WebSocket 与 HTTP 到底有哪些本质区别,握手流程为何能实现 “HTTP 升级”
- 如何用最简代码实现 WebSocket 客户端与服务端通信,关键 API 与事件有哪些
- 如何测试 WebSocket 通信模块,保证连接稳定、消息收发不丢包
章节内容(本讲核心):
- WebSocket 协议核心:原理、握手流程、帧结构解析
- 协议对比:WebSocket 与 HTTP 异同点(连接方式、通信模式、适用场景)
- 开发实战:客户端(浏览器)WebSocket 基础 API 使用、服务端(FastAPI/Python)简单实现
- 工程化落地:基础消息收发全流程、通信模块轻量测试思路
- AI 协同开发:利用大模型理解原理、生成可运行 Demo 并验证
与前置知识衔接(避免重复):
-
预设学生已掌握:HTTP 基本请求 / 响应流程、Python 基础运行环境(虚拟环境)、浏览器前端基础(HTML/JS)
-
本讲不深入:WebSocket 高级特性(心跳重连、二进制消息、加密)、生产级服务端架构
-
本讲定位:从 0 到 1 理解 WebSocket 核心,完成最简可运行 Demo,掌握 AI 辅助原理理解与代码生成的方法
-
生成原理讲解:让大模型用 “通俗语言 + 流程图” 形式讲解 WebSocket 握手流程与帧结构。
-
生成最简 Demo:指定技术栈(Vue3+TS 前端 + FastAPI/Python 后端),让 AI 输出 “文件路径 + 完整代码” 的可运行 Demo。
-
生成测试思路:根据 Demo 代码,让 AI 给出通信模块的基础测试用例(连接 / 断开 / 消息收发)。
-
AI 辅助原理拆解:给出 WebSocket 核心原理的结构化讲解(分点、图文描述)、与 HTTP 对比的表格。
-
学生主导代码验证、优化、联调:AI 生成代码后,学生需理解代码逻辑、修复潜在问题、完成端到端联调,对最终可运行结果负责。
- 场景提问:
- 网页聊天、实时监控页面如果用 HTTP 实现,会有什么问题?(频繁轮询、延迟高、资源浪费)
- 理想的实时通信应该满足什么要求?(实时响应、低开销、双向通信)
1. WebSocket 核心定义与价值
- 本质:基于 TCP 的全双工通信协议,允许浏览器与服务器建立持久长连接,实现双向实时数据传输。
- 核心价值:
- 长连接:一次握手,持续通信,避免 HTTP 频繁建立 / 断开连接的开销;
- 全双工:客户端 / 服务端可同时发消息,无需 “请求 - 响应” 绑定;
- 低延迟:无 HTTP 头冗余,数据帧体积小,响应速度快。
2. WebSocket 握手流程(核心重点)
WebSocket 依赖 HTTP 完成 “协议升级”,全程基于 TCP 连接,核心步骤:
- 客户端发起升级请求:
浏览器发送 HTTP GET 请求,携带关键头信息:
Upgrade: websocket:声明要升级为 WebSocket 协议;Connection: Upgrade:确认连接升级;Sec-WebSocket-Key:客户端生成的随机密钥(用于服务端验证);Sec-WebSocket-Version:协议版本(如 13)。
- 服务端验证并响应:
服务端验证 Sec-WebSocket-Key 后,返回 HTTP 101 状态码(Switching Protocols),携带:
Upgrade: websocket+Connection: Upgrade:确认升级;Sec-WebSocket-Accept:服务端用密钥计算后的验证值(客户端校验通过则连接建立)。- 计算方式:对
Sec-WebSocket-Key拼接固定 GUID258EAFA5-E914-47DA-95CA-C5AB0DC85B11后做 SHA-1,再进行 Base64 编码。
- 协议切换完成:
此后通信不再遵循 HTTP 规则,改用 WebSocket 帧结构传输数据。
3. WebSocket 帧结构(简化版)
无需深入二进制细节,核心理解:
- 帧是最小传输单元,包含 “操作码(文本 / 二进制 / 关闭等)、掩码(客户端发数据必带)、数据载荷”;
- 文本帧:传输字符串(如 JSON 格式消息);
- 控制帧:用于关闭连接、心跳检测等。
- 常见操作码:文本(1)、二进制(2)、关闭(8)、Ping(9)、Pong(10)。
4. WebSocket vs HTTP(核心对比)
| 维度 | HTTP | WebSocket |
|---|---|---|
| 连接类型 | 短连接(请求 - 响应后断开) | 长连接(一次握手持续通信) |
| 通信方向 | 单向(客户端请求→服务端响应) | 全双工(双向同时通信) |
| 触发方式 | 客户端主动发起 | 客户端 / 服务端均可主动推送 |
| 数据开销 | 每次带完整 HTTP 头 | 仅帧头(极小开销) |
| 适用场景 | 非实时请求(如页面加载) | 实时通信(如聊天、监控) |
1. AI 提示词模板(原理讲解)
请用“结构化分点 + 通俗举例”的方式讲解 WebSocket 核心原理,包含:
1. 握手流程(分步骤说明,标注关键 HTTP 头);
2. 帧结构的核心组成(不用讲二进制,只说作用);
3. 与 HTTP 的核心差异(用表格对比);
4. 举 1 个实时聊天场景的应用例子,说明 WebSocket 如何解决 HTTP 的痛点。
要求:语言通俗,避免专业术语堆砌,适合前端入门学习者理解。
2. 学生任务:
- 复制提示词到大模型,生成原理讲解内容;
- 用 3 句话总结 WebSocket 核心优势。
- 回顾:WebSocket 客户端(浏览器)有哪些核心 API?(
new WebSocket()、onopen、onmessage等)
1. 技术栈说明
- 客户端:Vue 3 + TypeScript(Vite 项目,SFC
script setup)。 - 服务端:FastAPI + Python(内置 WebSocket 路由)。
2. 示例项目结构(建议)
建议将示例项目拆成两个目录:一个放服务端(FastAPI),一个放前端(Vite + Vue3 + TS),结构如下(按此创建即可):
websocket-demo/
├─ server/
│ └─ app.py
└─ client/
└─ websocket-demo/
├─ index.html
├─ package.json
├─ tsconfig.json
├─ vite.config.ts
└─ src/
├─ main.ts
└─ components/
└─ WebSocketDemo.vue
3. 步骤 1:服务端实现(FastAPI + Python)
# app.py
from fastapi import FastAPI, WebSocket
import uvicorn
app = FastAPI()
@app.websocket("/ws")
async def ws_endpoint(websocket: WebSocket):
await websocket.accept()
try:
while True:
text = await websocket.receive_text()
await websocket.send_text(f"服务端已收到:{text}")
except Exception:
pass
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
4. 步骤 2:客户端实现(Vue 3 + TypeScript)
<!-- src/components/WebSocketDemo.vue -->
<template>
<div>
<h3>WebSocket 消息收发</h3>
<input v-model="msg" type="text" placeholder="输入消息" />
<button @click="send">发送</button>
<div style="margin-top: 20px; white-space: pre-line;">{{ logs }}</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, onBeforeUnmount } from 'vue';
const logs = ref('');
const msg = ref('');
let ws: WebSocket | null = null;
function log(content: string) {
logs.value += `${content}\n`;
}
function send() {
const text = msg.value.trim();
if (!text) return alert('请输入消息');
if (!ws || ws.readyState !== WebSocket.OPEN) {
alert('连接尚未建立');
return;
}
ws.send(text);
log(`📤 客户端发送:${text}`);
msg.value = '';
}
onMounted(() => {
ws = new WebSocket('ws://localhost:8000/ws');
ws.onopen = () => log('✅ 连接成功,可发送消息');
ws.onmessage = (event) => log(`📥 服务端回复:${event.data}`);
ws.onclose = () => log('❌ 连接已关闭');
ws.onerror = (event) => {
log('❌ 连接错误');
console.error(event);
};
});
onBeforeUnmount(() => {
if (ws && ws.readyState === WebSocket.OPEN) {
ws.close();
}
});
</script>
// src/main.ts
import { createApp } from 'vue';
import WebSocketDemo from './components/WebSocketDemo.vue';
createApp(WebSocketDemo).mount('#app');
文件路径:client/websocket-demo/index.html
<!-- index.html -->
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>WebSocket 基础 Demo</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
5. 运行与联调步骤(学生必做)
- 服务端依赖:在 server 目录执行
python -m venv venv && venv\Scripts\activate && pip install fastapi uvicorn; - 启动服务端:
python app.py(或uvicorn app:app --host 0.0.0.0 --port 8000); - 客户端项目:在 client 目录执行
npm create vite@latest websocket-demo -- --template vue-ts; - 进入项目并启动:
cd websocket-demo && npm install && npm run dev; - 打开浏览器:访问本地开发地址(如
http://localhost:5173)后进行测试:
- 如在 HTTPS 页面中使用,请将客户端地址改为
wss://,避免混合内容被浏览器阻止; - 输入消息点击 “发送”,客户端日志显示 “发送成功”;
- 服务端控制台显示收到的消息;
- 客户端收到服务端回显消息,页面展示日志;
- 关闭页面,服务端控制台显示 “客户端连接关闭”。
6. AI 辅助代码生成(可选)
提示词模板:
请生成“Vue 3 + TypeScript 客户端 + FastAPI/Python 服务端”的最简 WebSocket 通信 Demo,要求:
1. 客户端用 Vue 3 + TS + Vite,提供 src/components/WebSocketDemo.vue、src/main.ts、index.html;
2. 服务端用 FastAPI 提供 app.py,路径 /ws,监听 8000 端口,实现消息回显;
3. 覆盖核心事件:onopen/onmessage/onclose/onerror;
4. 输出“文件路径 + 完整代码 + 运行步骤”,确保可直接运行。
- 连接失败:检查服务端是否启动、端口是否被占用(换端口如 8081)、协议是否为
ws://(非http://); - 消息收发无响应:检查服务端
onmessage监听是否正确、客户端send方法是否触发; - 跨域 / 来源校验:本地开发通常无需处理;部署时可在握手阶段检查
Origin头或添加自定义验证逻辑,按需拒绝不可信来源的连接。
| 测试点 | 验证方式 | 预期结果 |
|---|---|---|
| 连接建立 | 启动服务端后打开客户端 | 客户端日志显示 “连接成功” |
| 消息发送 | 输入消息点击发送 | 服务端控制台打印消息,客户端显示发送日志 |
| 消息接收 | 服务端回显消息 | 客户端日志显示服务端回复 |
| 连接关闭 | 关闭客户端页面 | 服务端控制台显示 “连接关闭” |
| 异常处理 | 关闭服务端后客户端发送消息 | 客户端日志显示 “连接错误 / 关闭” |
2. 学生任务:
- 按测试用例逐条验证,记录 “测试结果 + 截图”;
- 模拟 1 个异常场景(如关闭服务端发消息),记录报错信息与原因。
1. 小结
- WebSocket 核心 API 是
new WebSocket()+ 四大事件(onopen/onmessage/onclose/onerror); - 服务端需监听连接、消息、关闭事件,实现双向通信;
- 联调关键是确保端口正确、协议格式无误(
ws://而非http://)。
2. 作业布置(需提交)
- 开发任务:实现可运行的 WebSocket 基础通信 Demo(客户端 + 服务端);
- 验证任务:截图 “连接成功、消息发送、消息接收、连接关闭”4 个关键界面;
- 理论任务:撰写 200 字原理说明,简述 WebSocket 通信原理与 HTTP 的核心区别;
- 提交要求(仅提交 1 个 PDF 文件):
- 使用 Markdown 编写作业内容(包含:原理说明 + 4 张关键截图 + 测试记录),导出为 PDF;
- PDF 命名:
学号-姓名-WebSocket作业.pdf; - 导出方式任选其一:Typora 导出 PDF / VS Code 安装 Markdown PDF 插件导出 / 其他能将 Markdown 转 PDF 的工具;
- 提交截止时间:【请补充具体时间】。
工程化落地补充(可选)
- 代码规范:变量 / 函数命名语义化(如
sendMsg而非fn1),日志输出清晰; - 可维护性:把 WebSocket 逻辑封装为独立函数 / 类,便于后续扩展(如心跳重连);
- 测试意识:养成 “先写测试用例,再验证功能” 的习惯,减少联调问题。