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

Spring Boot 实现 WebSocket(注解方式)

本文介绍如何使用 Spring Boot 的注解方式实现一个简单的 WebSocket 服务,支持客户端与服务器之间进行实时通信。

1. 引入依赖

在 pom.xml 文件中添加 WebSocket 相关依赖。

<dependencies>
    <!-- Spring Boot WebSocket 支持 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
</dependencies>

2.创建 WebSocket 服务类

使用 @ServerEndpoint 注解定义 WebSocket 的处理逻辑。下面是一个简单的示例类,它处理客户端连接、消息接收和消息发送。

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

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

    // 用于存储所有的会话
    private static final CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();
    private Session session;

    // 连接建立成功调用的方法
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        webSocketSet.add(this);
        System.out.println("新连接加入: " + session.getId());
    }

    // 连接关闭时调用的方法
    @OnClose
    public void onClose() {
        webSocketSet.remove(this);
        System.out.println("连接关闭: " + session.getId());
    }

    // 收到客户端消息时调用的方法
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("收到消息: " + message);
        broadcast("服务器: " + message);  // 广播消息给所有客户端
    }

    // 发送消息给客户端
    private void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }

    // 广播消息给所有客户端
    private static void broadcast(String message) {
        for (WebSocketServer webSocket : webSocketSet) {
            try {
                webSocket.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3. WebSocket 配置类

在 Spring Boot 中,需要通过配置类注册 WebSocket 端点。

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

@Configuration
public class WebSocketConfig {

    // 自动注册使用 @ServerEndpoint 注解声明的 WebSocket 端点
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

4. 编写前端客户端代码

为了测试 WebSocket 服务,可以通过一个简单的 HTML 文件与 WebSocket 服务进行交互。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>WebSocket Test</title>
</head>
<body>
    <h2>WebSocket 测试</h2>
    <input id="messageInput" type="text" placeholder="输入消息">
    <button onclick="sendMessage()">发送</button>

    <ul id="messages"></ul>

    <script>
        let socket = new WebSocket("ws://localhost:8080/ws");

        socket.onmessage = function(event) {
            let messages = document.getElementById("messages");
            let messageItem = document.createElement("li");
            messageItem.textContent = event.data;
            messages.appendChild(messageItem);
        };

        function sendMessage() {
            let input = document.getElementById("messageInput");
            let message = input.value;
            socket.send(message);
            input.value = '';
        }
    </script>
</body>
</html>

5. 启动应用程序

完成以上步骤后,启动 Spring Boot 应用程序。WebSocket 服务将会运行在 ws://localhost:8080/ws,前端可以通过该地址与服务器进行实时通信。

6. 测试 WebSocket

启动应用程序后,打开前端 HTML 页面。
输入消息并点击发送按钮,服务器会收到消息并将其广播给所有连接的客户端。
在浏览器开发工具中也可以观察到 WebSocket 的实时消息交互。


http://www.kler.cn/news/361657.html

相关文章:

  • STM32_实验5_中断实验
  • AI学习指南深度学习篇-对比学习的数学原理
  • 漏洞挖掘 | 基于mssql数据库的sql注入
  • flask 接口还在执行中,前端接收到接口请求超时,解决方案
  • Golang笔记_day10
  • 考研读研生存指南,注意事项
  • 中电金信:大模型时代 金融机构企业架构转型如何更智能化?
  • AUTOSAR_EXP_ARAComAPI的5章笔记(16)
  • 基于SSM的教务信息平台【附源码】
  • Java | Leetcode Java题解之第494题目标和
  • hdfs的客户端(big data tools插件)
  • golang 基本数据类型
  • NGINX 保护 Web 应用安全之基于 IP 地址的访问
  • 多品牌摄像机视频平台EasyCVR海康大华宇视视频平台如何接入多样化设备
  • IDEA如何查看所有的断点(Breakpoints)并关闭
  • Apple提出MM1.5:多模态大型语言模型微调的方法、分析和见解
  • 什么是第二层区块链?
  • GO之流程控制
  • stm32f103zet6 ili9341(fsmc) freertos 制作数字电子时钟
  • vue3 + ts + element-plus 二次封装 el-dialog
  • PostgreSQL的前世今生
  • python实现机器狗的行动控制
  • 【云原生】Kubernetes部署Jenkins静动Slave
  • 原型模式和建造模式的区别
  • STL源码剖析:适配器
  • 如何生成测试覆盖率的报告