当前位置: 首页 > news >正文

WebSocket 与 HTTP 的区别及 Spring Boot 实战应用

一、核心差异:WebSocket vs HTTP
特性HTTPWebSocket
连接方式短连接 (请求-响应后断开)长连接 (持久化双向通道)
通信方向单向 (客户端发起请求)双向 (服务端可主动推送)
协议开销每次请求携带完整 HTTP 头初始握手后仅传输数据
实时性低 (依赖轮询)高 (毫秒级延迟)
适用场景静态资源、API 请求实时聊天、股票行情、协同编辑

关键区别:WebSocket 通过一次 HTTP 握手升级为全双工 TCP 连接,实现服务端主动推送能力,突破 HTTP 单向通信的限制。

二、Spring Boot 中的 WebSocket 配置

1. 添加依赖 (pom.xml)

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2. 配置类注册 Bean

@Configuration
public class WebSocketConfiguration {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter(); // 自动注册@ServerEndpoint注解}
}
三、WebSocket 服务端实现
@Component
@ServerEndpoint("/ws/{sid}") // 定义WebSocket终结点路径
public class WebSocketServer {// 存储会话ID与Session对象的映射private static final Map<String, Session> sessionMap = new ConcurrentHashMap<>();/*** 连接建立成功时调用*/@OnOpenpublic void onOpen(Session session, @PathParam("sid") String sid) {sessionMap.put(sid, session);System.out.println("🚀 客户端连接: " + sid + " | 当前连接数: " + sessionMap.size());}/*** 收到客户端消息时调用*/@OnMessagepublic void onMessage(String message, @PathParam("sid") String sid) {System.out.println("📩 收到消息 [" + sid + "]: " + message);// 实现业务逻辑处理}/*** 连接关闭时调用*/@OnClosepublic void onClose(@PathParam("sid") String sid) {sessionMap.remove(sid);System.out.println("❌ 连接关闭: " + sid);}/*** 向所有客户端广播消息*/public void sendToAllClient(String message) {sessionMap.forEach((sid, session) -> {try {if (session.isOpen()) {session.getBasicRemote().sendText(message);}} catch (IOException e) {System.err.println("发送消息失败: " + e.getMessage());}});}
}
四、结合定时任务实现服务端主动推送
@Component
public class WebSocketTask {@Autowiredprivate WebSocketServer webSocketServer;/*** 每5秒向所有客户端推送服务器时间*/@Scheduled(fixedRate = 5000) public void sendServerTime() {String timeMsg = "服务器时间: " + LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_TIME);webSocketServer.sendToAllClient(timeMsg);}/*** 每天8:30推送业务报表*/@Scheduled(cron = "0 30 8 * * ?")public void sendDailyReport() {String report = generateDailyReport(); // 生成报表的业务方法webSocketServer.sendToAllClient(report);}
}
五、客户端连接示例 (JavaScript)
<script>
const socket = new WebSocket('ws://your-domain.com/ws/user123');// 监听连接建立
socket.onopen = () => {console.log('WebSocket连接已建立');socket.send('客户端就绪'); // 发送初始消息
};// 接收服务端消息
socket.onmessage = (event) => {console.log('收到服务端消息:', event.data);// 更新UI显示
};// 监听连接关闭
socket.onclose = () => {console.log('WebSocket连接已关闭');
};
</script>
六、生产环境最佳实践
  1. 连接管理优化

// 使用线程安全集合
private static final ConcurrentMap<String, Session> sessions = new ConcurrentHashMap<>();// 添加心跳检测机制
@OnMessage
public void onPong(PongMessage pong, @PathParam("sid") String sid) {// 处理心跳响应
}
  1. 消息压缩配置

# application.properties
server.compression.enabled=true
server.compression.mime-types=text/plain,text/html,application/json
  1. 安全加固

// 拦截器验证Token
public class AuthInterceptor extends HttpSessionHandshakeInterceptor {@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ...) {String token = ((ServletServerHttpRequest) request).getServletRequest().getParameter("token");return isValidToken(token); // 自定义验证逻辑}
}
  1. 集群支持方案

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketBrokerConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {// 使用RabbitMQ作为消息代理config.enableStompBrokerRelay("/topic").setRelayHost("rabbitmq-host");}
}
七、典型应用场景
  1. 实时监控系统

    • 服务器状态实时推送

    • 业务指标动态更新

  2. 协同办公工具

    • 文档协同编辑

    • 实时白板共享

  3. 金融交易系统

    • 股价实时波动推送

    • 交易指令即时执行

  4. 物联网(IoT)

    • 设备状态实时上报

    • 远程控制指令下发

性能对比:在 1000 并发连接下,WebSocket 比 HTTP 长轮询节省 95% 的带宽,降低 80% 的延迟(数据来源:WebSocket.org 基准测试)

通过 Spring Boot 的简洁实现,WebSocket 为现代 Web 应用提供了真正的实时双向通信能力,完美解决了 HTTP 协议在实时交互场景中的局限性。

http://www.lryc.cn/news/575791.html

相关文章:

  • [AI]从0到1通过神经网络训练模型
  • 128K 长文本处理实战:腾讯混元 + 云函数 SCF 构建 PDF 摘要生成器
  • C++智能指针概念及std::unique_ptr使用介绍
  • 【办公类-105-01】20250626 托小班报名表-条件格式-判断双胞胎EXCLE
  • CNN不是一个模型?
  • 跨越十年的C++演进:C++14新特性全解析
  • C++(模板与容器)
  • Java--程序控制结构(下)
  • springcloud 尚硅谷 看到9开头
  • NebulaGraph 图数据库介绍
  • 一分钟了解Transformer
  • 缓存与加速技术实践-MongoDB数据库应用
  • AI+时代已至|AI人才到底该如何培育?
  • Python打卡:Day37
  • 快速傅里叶变换(FFT)是什么?
  • 4.2_1朴素模式匹配算法
  • Webshell工具的流量特征分析(菜刀,蚁剑,冰蝎,哥斯拉)
  • LeetCode 2302.统计得分小于K的子数组数目
  • 力扣第45题-跳跃游戏2
  • [mcp-servers] docs | AI客户端-MCP服务器-AI 架构
  • linux cp与mv那个更可靠
  • 浅析阿拉伯语OCR技术的核心难点及其应用场景
  • LeetCode 2311.小于等于 K 的最长二进制子序列:贪心(先选0再选1)-好像还是比灵神写的清晰些
  • 996引擎-假人系统
  • VUE3入门很简单(3)--- watch
  • 重塑音视频叙事:Premiere文本剪辑与Podcast AI降噪的革命性工作流
  • 解决 “docker-compose: command not found“ 错误
  • C2远控篇CC++SC转换格式UUID标识MAC物理IPV4地址减少熵值
  • Selenium+Pytest自动化测试框架实战
  • 玄机抽奖Spring Web项目