一、生活比喻:WebSocket 是“对讲机”,HTTP 是“打电话”
要理解 WebSocket,先对比我们最熟悉的 HTTP。
📞 HTTP:像“打电话”——一问一答,有来有回
- 你想知道天气:“喂,今天天气怎么样?”(发送请求)
- 对方回答:“今天晴天。”(返回响应)
- 通话结束,线路断开。
- 你想再问:“明天呢?” → 得重新拨号,重新建立连接。
✅ 特点:短连接、无状态、一问一答。
❌ 缺点:想持续获取信息(比如股票行情、聊天消息),就得不断“拨电话”,效率低、延迟高。
📻 WebSocket:像“对讲机”——频道常开,随时说话
- 你和队友各持一部对讲机,频道一直开着(长连接)。
- 你一按按钮:“发现敌人!” → 对方立刻听到。
- 对方回应:“收到,准备反击。” → 你立刻听到。
- 不需要每次说话前都“拨号” ,信息实时双向传递。
✅ 特点:长连接、全双工、实时通信。
💡 这就是 WebSocket 的核心优势。
二、技术定义:WebSocket 是什么?
- WebSocket 是一种网络通信协议,定义在
RFC 6455标准中。 - 它在 单个 TCP 连接 上提供 全双工(full-duplex)通信通道。
- 客户端(浏览器)和服务器建立连接后,双方都可以随时主动向对方发送数据,不再受限于“请求-响应”模式。
📌 官方定义:
“WebSocket is a technology that makes it possible to open an interactive communication session between the user's browser and a server. With this API, you can send messages to a server and receive event-driven responses without having to poll the server for a reply.”
—— MDN Web Docs
三、WebSocket 是怎么建立连接的?—— “握手”过程
WebSocket 并不是凭空建立的,它借助 HTTP 协议完成“握手” ,然后“升级”为 WebSocket 连接。
🔄 连接建立流程(4 步)
- 客户端发起 HTTP 请求(带特殊头)
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Upgrade: websocket:表示“我想升级到 WebSocket 协议”。Connection: Upgrade:配合Upgrade头,表示希望切换连接。Sec-WebSocket-Key:客户端生成的随机密钥,用于安全校验。
- 服务器同意升级
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
- 状态码
101:表示“协议切换中”。 Sec-WebSocket-Accept:服务器根据客户端的Sec-WebSocket-Key计算出的响应密钥,完成校验。
-
握手完成,TCP 连接升级为 WebSocket 连接
- 此时,HTTP 协议“退场”,WebSocket 协议“接管”。
- 连接保持打开,进入全双工通信模式。
-
双向实时通信开始
- 服务器可以随时推送消息给客户端。
- 客户端也可以随时发送消息给服务器。
✅ 关键点:WebSocket 借用 HTTP 的“门”进来,然后换上自己的“衣服”(协议)开始工作。
四、WebSocket 的核心特性
| 特性 | 说明 |
|---|---|
| 全双工通信 | 客户端和服务器可以同时、独立地发送和接收数据,像打电话双方都能说话。 |
| 持久连接 | 连接建立后保持打开,不会像 HTTP 那样请求完就断开。 |
| 低延迟 | 不需要重复建立连接,消息可以即时推送,延迟极低(毫秒级)。 |
| 轻量级帧 | 数据以“帧”(frame)为单位传输,头部开销小(最小 2 字节),比 HTTP 高效。 |
| 跨域支持 | 支持 CORS 类似的机制,可通过 Origin 头控制访问权限。 |
五、WebSocket 在前端开发中的实际应用
1. 开发服务器热更新(HMR)——Vite 的核心
这就是我们之前讲的重点!
-
场景:你在写代码,保存文件,浏览器自动刷新。
-
传统方式:页面轮询服务器“代码变了吗?” → 效率低。
-
WebSocket 方式:
- Vite 服务器启动时,与浏览器建立 WebSocket 连接。
- 你修改
App.vue文件。 - Vite 服务器检测到文件变化。
- 通过 WebSocket 发送消息:
{ type: 'update', path: '/src/App.vue' } - 浏览器收到消息,动态加载新模块,替换旧模块 → 页面局部更新,无需刷新。
✅ 这就是 Vite “快如闪电”的关键之一!
2. 实时聊天应用(如微信网页版)
- 用户 A 发消息 → 服务器收到 → 通过 WebSocket 推送给用户 B 的浏览器 → 用户 B 立刻看到。
- 不需要用户 B 不断刷新页面。
3. 实时数据看板(股票、监控、游戏)
- 股票价格变动 → 服务器通过 WebSocket 推送新价格 → 网页上的数字实时刷新。
- 服务器性能监控 → 实时更新图表。
4. 在线协作文档(如腾讯文档)
- 你输入一个字 → 通过 WebSocket 发送到服务器 → 服务器推送给其他协作者 → 他们的屏幕上立刻显示。
六、WebSocket vs HTTP:对比表
| 特性 | HTTP | WebSocket |
|---|---|---|
| 连接模式 | 短连接(请求-响应后断开) | 长连接(持久保持) |
| 通信方向 | 半双工(客户端请求,服务器响应) | 全双工(双方可随时发) |
| 延迟 | 高(每次都要 TCP 握手、HTTP 头) | 低(连接已建立,直接发数据) |
| 开销 | 高(每次请求都有完整 HTTP 头) | 低(帧头最小 2 字节) |
| 适用场景 | 获取网页、提交表单、API 调用 | 实时聊天、推送通知、HMR、游戏 |
| 建立方式 | 直接发起请求 | 先 HTTP 握手,再协议升级 |
七、WebSocket 的局限性
虽然强大,但也不是万能的:
- 浏览器兼容性:现代浏览器都支持,但 IE10+ 才支持,老旧系统可能有问题。
- 代理和防火墙:某些网络环境可能阻止 WebSocket 连接(端口 80/443 通常开放,但协议可能被拦截)。
- 服务器资源:每个 WebSocket 连接都占用一个 TCP 连接和服务器内存,高并发时对服务器压力大(需用 Node.js、Go 等高并发语言优化)。
- 安全性:需防范 DDoS、消息注入 等攻击,建议使用
wss://(WebSocket Secure,基于 TLS)。
八、代码示例:前端如何使用 WebSocket?
// 1. 创建 WebSocket 连接
const socket = new WebSocket('ws://localhost:3000'); // ws = WebSocket, wss = Secure
// 2. 监听连接打开
socket.addEventListener('open', (event) => {
console.log('WebSocket 连接已建立!');
socket.send('你好,服务器!');
});
// 3. 监听服务器发来的消息
socket.addEventListener('message', (event) => {
console.log('收到消息:', event.data);
// 比如:处理热更新指令
if (event.data.type === 'update') {
// 重新加载模块...
}
});
// 4. 监听错误
socket.addEventListener('error', (event) => {
console.error('WebSocket 错误:', event);
});
// 5. 监听连接关闭
socket.addEventListener('close', (event) => {
console.log('连接已关闭');
});
九、总结:WebSocket 的核心价值
WebSocket 的本质,是让“服务器”拥有了“主动说话”的能力。
在传统 HTTP 模型中,服务器是“被动的”,只能等客户端来问。
而 WebSocket 让服务器可以像“广播站”一样,主动向客户端推送信息。
在前端开发中,它解决了:
- 开发效率问题:通过 HMR 实现毫秒级热更新。
- 用户体验问题:实现实时交互,无需刷新。
- 性能问题:减少轮询,降低延迟和带宽消耗。
🎯 最后一句话
WebSocket 不是取代 HTTP,而是补充 HTTP 的“实时通信短板”。
它让现代 Web 应用从“静态页面”进化为“实时交互平台”,是 Vite、在线协作、直播弹幕、金融交易等场景的“幕后英雄”。