WebSocket 在 Spring Boot 中的高级应用指南

news/2024/9/28 13:36:33 标签: websocket, spring boot, 网络协议

WebSocket 在 Spring Boot 中的高级应用指南

深入理解WebSocket协议
深入理解STOMP协议

1. 概述

WebSocket 是一种基于 TCP 的全双工通信协议,允许服务器和客户端之间进行持续的双向通信。与传统的 HTTP 请求-响应模型不同,WebSocket 是一个持久的连接,可以在服务器和客户端之间进行实时数据交换,特别适用于需要频繁更新的场景,比如实时聊天、在线游戏、金融市场数据等。

在 Spring Boot 中,WebSocket 有多种实现方式,开发者可以根据具体的业务需求选择合适的方式。本文将详细介绍以下三种 WebSocket 的实现方式:

  1. 基于注解的 JSR 356 标准实现。
  2. 基于 Spring 的 WebSocketHandler 接口实现。
  3. 基于 STOMP 协议的实现。

通过这些不同的方式,开发者能够灵活地实现实时通信,满足各种场景下的需求。


2. 基于注解的 JSR 356 实现

JSR 356 是 Java 的标准 WebSocket API,它允许开发者使用注解来处理 WebSocket 的连接、消息传递和关闭等事件。JSR 356 的实现方式非常直观,适合轻量级的 WebSocket 应用。

2.1 配置与实现

依赖添加:

pom.xml 中添加 WebSocket 相关的依赖:

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

WebSocket 配置类:

为了让 Spring Boot 支持 WebSocket,我们需要配置一个 ServerEndpointExporter,它会自动注册所有标注了 @ServerEndpoint 的类。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
public class WebSocketConfig {
   

    // 启用 WebSocket 支持,自动扫描并注册 @ServerEndpoint 注解的类
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
   
        return new ServerEndpointExporter();
    }
}

WebSocket 服务端实现类:

使用 @ServerEndpoint 注解来指定 WebSocket 端点路径,处理客户端的连接、消息和关闭事件。

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

@ServerEndpoint("/ws")
public class WebSocketServer {
   

    // 存储所有的 WebSocket 客户端连接
    private static final CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();
    private Session session; // 当前会话的连接

    /**
     * 客户端连接建立时调用
     * @param session WebSocket 会话
     */
    @OnOpen
    public void onOpen(Session session) {
   
        this.session = session;
        webSocketSet.add(this); // 将新的连接加入集合
        System.out.println("新连接建立: " + session.getId());
        sendMessage("连接成功");
    }

    /**
     * 客户端发送消息时调用
     * @param message 客户端发来的消息
     */
    @OnMessage
    public void onMessage(String message) {
   
        System.out.println("收到消息: " + message + " 来自: " + session.getId());

        // 广播消息给所有连接的客户端
        for (WebSocketServer webSocket : webSocketSet) {
   
            try {
   
                webSocket.sendMessage("服务器收到消息: " + message);
            } catch (IOException e) {
   
                e.printStackTrace();
            }
        }
    }

    /**
     * 客户端断开连接时调用
     * @param session WebSocket 会话
     */
    @OnClose
    public void onClose(Session session) {
   
        webSocketSet.remove(this); // 连接关闭时移除
        System.out.println("连接关闭: " + session.getId());
    }

    

http://www.niftyadmin.cn/n/5681194.html

相关文章

深信服2025届全球校招研发笔试-C卷(AK)

前面14个填空题 T1 已知 子数组 定义为原数组中的一个连续子序列。现给定一个正整数数组 arr&#xff0c;请计算该数组内所有可能的奇数长度子数组的数值之和。 输入描述 输入一个正整数数组arr 输出描述 所有可能的奇数长度子数组的和 示例 1 输入 1,4,2,5,3 输出 58 说明 …

Spark Job 对象 详解

在 Apache Spark 中&#xff0c;Job 对象是执行逻辑的核心组件之一&#xff0c;它代表了对一系列数据操作&#xff08;如 transformations 和 actions&#xff09;的提交。理解 Job 的本质和它在 Spark 中的运行机制&#xff0c;有助于深入理解 Spark 的任务调度、执行模型和容…

ESP32 Bluedroid 篇(1)—— ibeacon 广播

前言 前面我们已经了解了 ESP32 的 BLE 整体架构&#xff0c;现在我们开始实际学习一下Bluedroid 从机篇的广播和扫描。本文将会以 ble_ibeacon demo 为例子进行讲解&#xff0c;需要注意的一点是。ibeacon 分为两个部分&#xff0c;一个是作为广播者&#xff0c;一个是作为观…

深度学习自编码器 - 提供发现潜在原因的线索篇

序言 在探索复杂数据背后的秘密时&#xff0c;深度学习如同一把锐利的钥匙&#xff0c;特别是其核心的表示学习机制&#xff0c;为我们打开了一扇通往未知世界的大门。表示学习不仅仅是数据的简单编码或转换&#xff0c;它更是深度挖掘数据内在结构、关系与规律的过程。在这一…

web前端-CSS引入方式

一、内部样式表 内部样式表(内嵌样式表)是写到html页面内部,是将所有的 CSS 代码抽取出来,单独放到一个<styie>标签中。 注意: ① <style>标签理论上可以放在 HTML文档的任何地方&#xff0c;但一般会放在文档的<head>标签中 ② 通过此种方式&#xff0c;可…

【JavaEE初阶】深入理解wait和notify以及线程饿死的解决

前言&#xff1a; &#x1f308;上期博客&#xff1a;【JavaEE初阶】深入解析死锁的产生和避免以及内存不可见问题-CSDN博客 &#x1f525;感兴趣的小伙伴看一看小编主页&#xff1a;【JavaEE初阶】深入解析死锁的产生和避免以及内存不可见问题-CSDN博客 ⭐️小编会在后端开…

Reactor 反应堆模式

Reactor 反应堆模式 1、概念 Reactor&#xff08;反应堆&#xff09;模式是一种事件驱动的设计模式&#xff0c;通常用于处理高并发的I/O操作&#xff0c;尤其是在服务器或网络编程中。它基于事件多路复用机制&#xff0c;使得单个线程能够同时管理大量并发连接&#xff0c;而…

el-table给列加单位,表头加样式,加斑马纹

<el-table ref"table" class"dataTable" :data"detailList" :header-cell-style"tableHeaderColor" :row-class-name"tableRowClassName" highlight-current-row><el-table-column label"序号" al…