Websocket

1. Websocket是什么?

  • WebSocket 是一种基于 TCP 的应用层通信协议,它通过在单个 TCP 连接上提供全双工、双向、低延迟的数据传输能力,彻底解决了传统 HTTP 协议在实时通信场景中的瓶颈问题。
  • WebSocket 的本质是:在 TCP 层之上,为实时双向通信设计的轻量级应用层协议。
  1. 核心定义
    协议定位:运行在 TCP 之上的独立应用层协议(RFC 6455 标准)。

连接方式:通过一次 HTTP 握手升级协议(Upgrade: websocket),将 TCP 连接从 HTTP 切换为 WebSocket 协议。

通信模式:建立连接后,客户端与服务器可主动、实时、双向发送数据(文本或二进制)。

协议开销:数据传输使用轻量级帧结构(帧头仅 2~14 字节)。

2. 为什么要用 WebSocket?

传统 HTTP 协议在实时通信中存在致命缺陷,而 WebSocket 完美解决了这些问题:

  1. 突破 HTTP 的"请求-响应"枷锁
    HTTP 问题:通信必须由客户端发起,服务器无法主动推送数据。

WebSocket 方案:连接建立后,服务器可随时主动推送数据(如实时股价、聊天消息)。

  1. 降低协议开销,提升传输效率
    HTTP 问题:每个请求/响应携带完整头部(Cookie、User-Agent 等冗余数据)。

WebSocket 方案:连接建立后,数据传输只需 2~14 字节的轻量帧头,效率提升 10 倍以上。

  1. 原生支持全双工通信
    HTTP 问题:半双工(客户端请求时不能接收响应,反之亦然)。

WebSocket 方案:客户端和服务器可同时发送数据(如视频通话中的实时音画同步)。

什么场景下用Websocket协议?

WebSocket 是以下场景的解决方案:

实时消息推送

→ 聊天应用(微信/钉钉)、弹幕系统、通知中心。

金融实时数据

→ 股票行情、加密货币价格波动(每秒推送多次)。

在线协作工具

→ 多人文档编辑(如腾讯文档)、远程白板。

实时游戏

→ 网页版 MOBA 游戏、棋牌类游戏(玩家动作同步)。

IoT 设备监控

→ 传感器数据实时仪表盘(温度/湿度/压力)。

如何使用WebSocket?

使用@ServerEndpoint把一个类转为WebSocket 服务端点。

在spring中使用这种方式需要注意一个问题:

WebSocket 端点实例的创建是由 WebSocket 容器负责的,不是由 Spring 容器直接管理的,常规@Autowired方式(通过把注解加到变量上通过类名自动注入)无法正常工作。

解决方法,通过@Autowired标注set方法赋值:

复制代码
@Autowired //Autowired标记set方法, Spring 在初始化时调用这些 setter 方法,把相应的 Bean 注入到静态变量中
    public void setChatRecordDao(ChatRecordDao chatRecordDao) {
        WebSocketServiceImpl.chatRecordDao = chatRecordDao;
    }

其中chatRecordDao 是当前类的静态变量。

为什么这种方法有用?

Spring会扫描并处理WebSocket端点类中的setter方法,即使这些实例不是由Spring容器创建的。因为@Autowired不能放在静态变量上,所以采用这个迂回的方法。

注意每建立一个websocket连接,就会创建一个WebSocket 端点实例。

相关推荐
腻害兔6 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社7 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖8 小时前
JDK 26 新特性详解
java·开发语言
马优晨9 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
维天说11 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane199412 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
噢,我明白了13 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品13 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘13 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记14 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端