服务公告
了解WebSocket的优点和缺点:一文详解
发布时间:2025-11-27 00:33
先把话说明白:WebSocket 的核心价值,就是在浏览器和服务器之间建立一条“长期在线、双向实时”的通道,但它不是万能银弹,用错场景一样会“翻车”🙂。
一、WebSocket 是什么?一句话版本

传统 HTTP 是:一次请求 → 一次响应 → 连接关闭。
WebSocket 则是:一次握手 → 建立长连接 → 双向持续收发数据。
底层仍然跑在 TCP 之上,只是协议升级后,不再按 HTTP 请求/响应模式走,而是走帧(frame)形式的全双工通信。
二、WebSocket 的主要优点 ✅
- 实时性强,真正全双工
- 建立连接后,客户端和服务端都可以主动发消息,不用轮询。
- 聊天系统、实时看板、实时推送、在线游戏等场景,延迟明显更低。
- 总结一句:消息“来了就推”,不必“轮询来问” ⏱️。
- 网络开销更低
- 传统轮询:每次请求都带 HTTP 头部,握手开销大。
- WebSocket:只在握手阶段使用一次 HTTP,之后走轻量帧格式。
- 在高并发、频繁推送的场景里,可以明显节省带宽和服务器开销。
- 长连接 + 状态保持更方便
- 一条连接可以承载大量业务交互,比如认证后持续通信。
- 对需要“持续会话”的业务(如 IM、协作编辑)非常合适。
- 支持二进制
- 不仅能发文本,还能发二进制数据,如音视频片段、协议缓冲数据等。
- 对实时音视频、游戏同步等场景,是个加分项 🎮。
- 跨语言、跨平台支持成熟
- 浏览器原生支持 WebSocket API。
- 后端生态完善:Node.js、Java、Go、Python 等都有成熟实现。
三、WebSocket 的主要缺点 ⚠️
- 连接管理复杂度高
- 每个在线用户都要维持一条或多条长连接。
- 连接数 = 资源占用,需要考虑内存、文件句柄上限、负载均衡策略。
- 一旦做不好连接回收、心跳检测,很容易出现“僵尸连接”。
- 与无状态架构理念有冲突
- 传统 HTTP 接口更偏向无状态服务,水平扩容简单。
- WebSocket 需要考虑:这个连接被分配到哪台机器、消息怎么广播、多节点之间如何同步。
- 有时需要额外引入消息队列、集群广播等组件,增加架构复杂度。
- 断线重连、心跳需要自己设计
- 浏览器只提供最基础的 API,不帮你做重连和心跳。
- 心跳策略、超时重连、频率控制 都要自己定义,否则容易出现“看起来在线,其实已掉线”的假象。
- 不适合所有业务场景
- 如果是普通页面浏览、小表单提交、偶发请求:
- 传统 HTTP / REST / Fetch 足够。
- 在这类场景硬上 WebSocket,只会增加复杂度而不带来收益。
- 如果是普通页面浏览、小表单提交、偶发请求:
- 网络及中间件兼容性要关注
- 某些老旧代理或网关对 WebSocket 支持不好。
- 需要确保:负载均衡、反向代理、WAF 都正确支持 WebSocket 协议升级(Upgrade)。
四、优缺点对比一览表(便于快速记忆)
| 维度 | 优点 | 缺点 |
|---|---|---|
| 通信模式 | 全双工、实时推送,延迟低 | 需要连接状态管理,更难调试 |
| 资源开销 | 频繁消息场景下,头部开销小,长期更省 | 长连接多时占用内存和句柄,需要优化连接数和心跳 |
| 架构复杂度 | 客户端开发体验好,接口简单 | 服务端需要处理集群广播、会话路由,架构复杂度上升 |
| 适用场景 | 聊天、实时看板、协同编辑、游戏、行情推送等 | 普通增删改查、小量请求用它是“杀鸡用牛刀” |
五、简单示例:浏览器端 WebSocket 使用
const ws = new WebSocket('wss://example.com/chat');
ws.onopen = () => {
ws.send('hello');
};
ws.onmessage = (event) => {
console.log('收到消息:', event.data);
};
ws.onclose = () => {
console.log('连接已关闭');
};
逐行解释:
const ws = new WebSocket('wss://example.com/chat');
创建一个 WebSocket 客户端对象,wss://表示基于 TLS 加密的 WebSocket,类似 HTTPS 相比 HTTP 更安全。这里的 URL 指向服务器的 WebSocket 接入地址。ws.onopen = () => { ... }
当连接建立成功时触发onopen事件。在这个回调里可以执行初始化操作,例如发送首次身份信息或问候消息,这里简单发送字符串"hello"。ws.onmessage = (event) => { ... }
当服务器向客户端推送消息时会触发onmessage事件。event.data就是收到的消息内容,可以是字符串或二进制数据,这里通过console.log打印出来,用于调试或展示在页面上。ws.onclose = () => { ... }
当连接被关闭(正常关闭或异常断开)时触发onclose。在这里通常会做两件事:日志记录 + 视情况触发重连逻辑,例如提示用户“连接已断开,请刷新”。
六、什么时候该用 WebSocket,什么时候不要硬上?
适合用 WebSocket 的场景:
- 即时通讯:单聊、群聊、客服系统。
- 实时数据推送:监控面板、运营看板、行情推送、在线状态。
- 在线协作:协同编辑文档、白板、多人互动工具。
- 游戏/互动:实时对战、社交小游戏等。
不太适合的场景:
- 普通内容浏览型网站,只是偶尔提交表单。
- 简单 CRUD 管理后台,没有高实时性要求。
- 一次性短操作,用完即走,不需要保持会话。
七、收个尾:一句话总结
如果只用一句话给你决策参考:
当你的业务确实需要“持续在线 + 高频交互 + 服务端主动推送”,WebSocket 非常值得上;否则,就老老实实用普通 HTTP,更简单、更稳。 🚀
已经是第一篇啦!
下一篇: 服务器路由命令有哪些常用技巧?