WebSocket和HTTP对比
| 对比维度 | 🔗WebSocket | 📬HTTP |
|---|---|---|
| 通信方向 | 全双工,客户端和服务器可以同时、互相发送消息。 | 半双工/单工,必须由客户端发起请求,服务器才能响应。 |
| 连接状态 | 持久连接,一旦建立,除非主动关闭,否则一直保持在线。 | 短连接,每次请求/响应后,连接通常就会断开(Keep-Alive 也只是复用,不是长连)。 |
| 服务端能力 | 可以主动向客户端推送数据(如实时通知)。 | 不能主动推送,只能被动响应客户端的请求。 |
| 实时性 | 极高,消息到达即发送,延迟低。 | 较低,需要客户端不断轮询(频繁发请求)才能获取新数据。 |
| 适用场景 | 实时聊天、在线游戏、股票行情、协同编辑等。 | 传统的网页浏览、API 调用、文件下载等 |
提示:这里主要是WebSocket的一个实例,具体根据实际需求
1. 概述
平台目前提供1 个 WebSocket 端点:设备列表实时推送。
| 项目 | 说明 |
|---|---|
| 业务需求 | 大屏需要实时获取 列表设备的最新健康度状态(1分钟1次)这个时间频率可自行设置 |
| 数据同源 | 与 HTTPPOST /device/list共用TwinbornService.listDevices() |
| 推送方式 | 连接后立即推送 1 次,之后每60 秒自动推送 |
| 协议 | 纯文本 JSON(TextMessage) |
注意:一般来说使用WebSocket实时推送,都会写一个HTTP接口,防止实时接口获取不到,可手动获取HTTP
HTTP 示例
2. 连接地址 (和HTTP区别是 前缀连接不同,接口前方加/ws)
默认端口:45152 (我自己项目中的端口定义,实际根据自己项目来)
ws://{host}:45152/ws/device/list生产环境建议使用 WSS:
wss://{host}:{port}/ws/device/list //wss 数据传输需要加密,考虑到数据安全3.跨域:
WebSocketConfig中配置了setAllowedOrigins("*"),允许任意来源连接。
这里可以根据AI生成WebSocketConfig的连接工具类,类似HTTP的连接工具类
4. 筛选参数
4.1 连接时通过 URL Query 传入(可选)
ws://{ip}:45152/ws/device/list?treePath=压缩机&deviceName=螺杆&abnormal=true| 参数 | 类型 | 说明 |
|---|---|---|
treePath | String | 组织树路径(tree_path)模糊匹配 |
deviceName | String | 设备名称(device_name)模糊匹配 |
abnormal | Boolean | true仅异常(预警/报警);false仅正常;不传则不过滤 |
Query 值会做 UTF-8 URL 解码。
4.2 连接后通过 JSON 文本消息更新(可选)
客户端可随时发送 JSON 文本,立即触发一次推送,后续仍按 60 秒周期推送。
{ "treePath": "注采站", "deviceName": "压缩机", "abnormal": true }格式错误时服务端返回:
{ "code": 500, "message": "消息体须为 JSON,字段:treePath、deviceName、abnormal", "data": null }5. 推送规则
| 时机 | 行为 |
|---|---|
| 连接建立 | 解析 URL Query → 启动定时任务 →立即推送 |
| 定时任务 | 每60 秒推送一次(PUSH_INTERVAL_SECONDS = 60) |
| 收到客户端 JSON | 更新筛选条件 →立即推送 |
| 连接关闭 / 传输异常 | 取消该 session 的定时任务 |
| 服务销毁 | @PreDestroy取消所有任务并关闭线程池 |
6. 消息格式
6.1 成功响应
结构与 HTTP 接口一致,为Result<List<TwinbornDeviceSearchVo>>:
{ "code": 200, "message": "success", "data": [ { } ] }6.3 失败响应
{ "code": 500, "message": "设备列表推送失败", "data": null }7. 与 HTTP 接口对照
| 对比项 | WebSocket | HTTP |
|---|---|---|
| 地址 | ws://.../ws/device/list | POST /device/list |
| 参数方式 | URL Query 或连接后发 JSON 文本 | Request Body JSON |
| 返回结构 | Result<List<TwinbornDeviceSearchVo>> | 相同 |
| 业务逻辑 | twinbornService.listDevices(query) | 相同 |
| 推送 | 连接后即时 + 每 60 秒 | 单次请求单次返回 |
8. 内部实现要点
8.1TwinbornWebSocketConfig
registry.addHandler(deviceListWebSocketHandler, "/ws/device/list") .setAllowedOrigins("*");注册 Handler 与路径
启用 Spring WebSocket(
@EnableWebSocket)
. 前端接入示例
9.1 原生 WebSocket
const ws = new WebSocket( 'ws://{ip}:45152/ws/device/list?treePath=压缩机&abnormal=true' ); ws.onmessage = (event) => { const result = JSON.parse(event.data); if (result.code === 200) { console.log('设备列表', result.data); } else { console.error(result.message); } }; // 动态更新筛选条件(会立即收到新推送) ws.send(JSON.stringify({ treePath: '注采站', deviceName: '压缩机', abnormal: false })); ws.onclose = () => console.log('连接已关闭');9.2 典型使用场景
大屏/监控页:建立长连接,每 60 秒自动刷新设备健康状态
带筛选的列表页:URL 带初始条件,用户改筛选时
sendJSON 即可
10. 注意事项
单向推送为主:服务端主动推送;客户端发消息仅用于更新筛选条件
无心跳机制:依赖 60 秒定时推送;网络断开后需前端自行重连
无鉴权:当前 Handler 未做 Token / Session 校验
并发安全:同一 session 发送使用
synchronized(session)空参数:不传筛选条件时返回全部未删除设备(与 HTTP 行为一致)
11. Maven 依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>