1650 字
约 5 分钟
1
WebSocket 入门

WebSocket 入门

1. 一句话简介

WebSocket 是一种建立在 TCP 之上的全双工通信协议,客户端与服务端之间只需一次握手建立长连接,之后双方即可随时相互发送数据,无需像 HTTP 那样每次请求都重新建立连接。它解决的核心问题是「服务端主动推送」与「实时双向通信」——例如本模块 demo-websocket 中,后端用 @Scheduled 定时任务每 2 秒采集一次服务器 CPU、内存、JVM、磁盘状态,再通过 SimpMessagingTemplate.convertAndSend("/topic/server", ...) 主动推送给前端,前端订阅该主题即可实时刷新监控面板,全程无需前端轮询。

2. 什么时候使用

  • 服务端主动推送数据:数据变化由服务端产生并需要即时通知客户端时(如监控指标、告警、行情),WebSocket 提供成熟的主动推送通道,本模块的服务器状态监控即典型场景。
  • 高频实时双向交互:消息频率高、延迟敏感的场合,如在线协作编辑、实时面板、多人在线对战,一遍握手后即可持续通信,避免高频 HTTP 建连开销。
  • 需要消息主题订阅/广播机制:当多个客户端需要按主题分组接收消息时,配合 STOMP 协议的 subscribe/convertAndSend 即可轻松实现一对多广播(本模块用 /topic/server 广播服务器状态)。
  • 需要跨域连接与兼容降级:服务端与前端分离部署、需要解决跨域,或需兼容不支持原生 WebSocket 的老旧浏览器时,SockJS 可自动降级为轮询等方案。
  • 低频、一次性请求:若仅是「拉取一次数据」或消息频率很低,普通 HTTP REST 接口更简单、开销更小,无需长连接。
  • 以服务端单向推送为主、无需双向:若只需服务端→客户端单向通知,SSE(Server-Sent Events)用起来更轻、无二进制协议复杂度、自带自动重连,通常足够。
  • 对消息可靠性要求极高:WebSocket 依赖 TCP 长连接,一旦连接意外断开会丢失期间消息;若要求「消息绝不能丢」或需要离线补发,仍需配合消息队列(MQ)落库补偿,WebSocket 本身不负责持久化。
  • 大规模高并发下未做横向扩展:原生/简单代理(本模块的 Spring 内存 broker)把连接绑定在单实例内存中,多实例部署时推送无法跨节点路由,需引入集群化代理(如 RabbitMQ/Redis 的 STOMP 支持)才能扩展。
  • 纯文本/简单轮询能覆盖的场景:若非实时性刚需,轮询实现更简单可控、更易监控排错,过早引入长连接徒增维护成本。

3. 常见业务场景

  • 服务器/应用实时监控面板:像 demo-websocket 演示的那样,后端定时采集 CPU、内存、JVM、磁盘等指标并通过 WebSocket 推送到前端,运维人员无需刷新页面即可实时看到资源变化,适合监控看板、大屏展示。
  • 即时聊天/消息通知系统:用户 A 发消息,服务端即可把消息推送给在线用户 B(甚至通过主题广播给群组成员),是 WebSocket 最经典的应用,本模块以「服务器推送」替代聊天来演示同一底层能力。
  • 实时行情与金融报价:价格、汇率、指数等高频变化数据,服务端主动推送可保证多客户端同时获取最新行情,避免高频轮询造成服务端压力。
  • 在线协作与多人在线小游戏:多人同时编辑文档、白板协作或对战时,需要低延迟地同步每个人产生的操作事件,双向实时通道可即时通知所有参与者,STOMP 主题还能干净地划分房间/会话维度。
  • 推送类消息广播:如系统公告、库存变动、订单状态更新等需要同时触达多个订阅者的场景,借助 WebSocket 主题广播(/topic/...)一次推送、多方即时收到。

4. 同类技术对比

对比维度 WebSocket(本模块) HTTP 短轮询(Polling) HTTP 长轮询(Long Polling) SSE(Server-Sent Events)
通信方向 双向全双工 客户端→服务端(单向请求) 客户端发起、服务端延迟响应 仅服务端→客户端(单向)
连接模型 一次握手后保持长连接 每次请求新建连接 保持连接直到有数据再返回 单向持久连接
实时性 低(取决于轮询间隔) 中等
服务端压力 低(连接复用) 高(频繁建连、空转) 中等
消息订阅/路由 STOMP 提供 subscribe/广播 无,需自行实现 无,需自行实现 无,仅简单事件流
浏览器兼容 现代浏览器,SockJS 可降级 全部 全部 不支持 IE,原生自动重连
去重/顺序保证 应用层需自行保证 简单(请求响应天然对应) 需处理悬挂请求 自带重连与 Last-Event-ID
适用规模 中大规模实时/双向场景 低频率小规模 消息不频繁但要及时 服务端单向推送 / 中大规模

选型建议

需要双向实时交互(客户端也要主动发命令、反馈操作),或希望借助 STOMP 主题订阅/广播 简化分组推送逻辑时,选 WebSocket,本模块即用其实现服务器监控推送。若是纯粹服务端单向推送且希望实现简单、自带自动重连,选 SSE 更轻量。若消息频率很低、又不想引入任何长连接复杂度,短轮询最简单可控、便于排错。只有在既需实时、又面临多实例水平扩展和消息可靠落库的严格要求时,才应在 WebSocket 之上叠加消息队列或集群化消息代理来解决跨节点路由与补偿问题。

WebSocket 入门
http://clxhxhhr.top/posts/511/
作者
clxstart
发布于
2026-09-07
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。