Spring Boot实现WebSocket详解

文章目录

Spring Boot实现WebSocket详解

一、引言

在现代Web开发中,实时通信成为了提升用户体验的关键技术之一。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,允许服务器主动向客户端发送消息,非常适合需要实时数据交换的应用场景,如在线聊天、实时通知等。Spring Boot通过集成Spring WebSocket模块,提供了一种简洁的方式来实现WebSocket通信。本文将详细介绍如何在Spring Boot中实现WebSocket,包括配置、编码以及实现实时消息传递和群发消息。

二、Spring Boot集成WebSocket

1、添加依赖

首先,我们需要在Spring Boot项目的pom.xml文件中添加WebSocket的依赖。

xml 复制代码
<dependencies>
    <!-- Spring Boot Web依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Spring Boot WebSocket依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
</dependencies>

2、配置WebSocket

接下来,我们需要创建一个配置类来设置WebSocket的消息代理和端点。

java 复制代码
package com.example.demo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/websocket-endpoint").withSockJS();
    }
}

在上述配置中,我们启用了简单的消息代理,并设置了应用前缀为/app。同时,我们注册了一个STOMP端点,并启用了SockJS支持。

3、创建消息模型

定义一个简单的消息模型,用于在WebSocket通信中传递消息。

java 复制代码
package com.example.demo.model;

public class Message {
    private String content;
    private String sender;

    // 构造函数、getter和setter方法
    public Message() {}

    public Message(String content, String sender) {
        this.content = content;
        this.sender = sender;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getSender() {
        return sender;
    }

    public void setSender(String sender) {
        this.sender = sender;
    }
}

4、创建消息处理器

创建一个控制器来处理WebSocket消息。

java 复制代码
package com.example.demo.handler;

import com.example.demo.model.Message;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

@Controller
public class MessageHandler {

    @MessageMapping("/send")
    @SendTo("/topic/messages")
    public Message sendMessage(Message message) {
        return new Message("Hello, WebSocket!", "System");
    }
}

在这个控制器中,我们定义了一个sendMessage方法,它将处理发送到/send目的地的消息,并将响应发送到/topic/messages主题。

5、前端实现

创建一个简单的HTML页面和JavaScript代码,用于连接WebSocket服务器并发送消息。

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Demo</title>
    <script src="https://cdn.jsdelivr.net/npm/sockjs-client/dist/sockjs.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/stompjs/lib/stomp.min.js"></script>
</head>
<body>
    <div>
        <input type="text" id="messageInput" placeholder="Type a message...">
        <button onclick="sendMessage()">Send</button>
    </div>
    <ul id="messagesList"></ul>
    <script>
        var socket = new SockJS('/websocket-endpoint');
        var stompClient = Stomp.over(socket);
        stompClient.connect({}, function (frame) {
            stompClient.subscribe('/topic/messages', function (message) {
                var messagesList = document.getElementById('messagesList');
                var listItem = document.createElement('li');
                listItem.textContent = message.body;
                messagesList.appendChild(listItem);
            });
        });
        function sendMessage() {
            var messageInput = document.getElementById('messageInput');
            stompClient.send('/app/send', {}, messageInput.value);
            messageInput.value = '';
        }
    </script>
</body>
</html>

在上述代码中,我们创建了一个HTML页面,用户可以通过输入框发送消息,并通过JavaScript连接到WebSocket服务器。

三、实现实时消息传递和群发消息

1、实时消息传递

为了实现实时消息传递,我们可以在MessageHandler中添加一个方法来接收客户端发送的消息。

java 复制代码
@MessageMapping("/receive")
@SendTo("/topic/messages")
public Message receiveMessage(Message message) {
    return new Message("Received your message: " + message.getContent(), "System");
}

2、群发消息

WebSocketConfig中配置广播代理,以实现群发消息。

java 复制代码
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic");
    config.setApplicationDestinationPrefixes("/app");
    config.setBrokerDeliveryMode(MessageBrokerRegistry.BrokerDeliveryMode.BROADCASTING);
}

通过设置BrokerDeliveryModeBROADCASTING,所有发送到/topic/messages的消息都会被广播到所有连接的客户端。

四、总结

本文详细介绍了如何在Spring Boot中实现WebSocket,包括添加依赖、配置WebSocket、创建消息模型和处理器,以及如何实现实时消息传递和群发消息。通过这些步骤,您可以在Spring Boot应用程序中轻松集成WebSocket,实现实时通信功能。希望本文能够帮助您在开发中更加得心应手。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

相关推荐
Future_yzx24 分钟前
基于SpringBoot+WebSocket的前后端连接,并接入文心一言大模型API
spring boot·websocket·文心一言
stevewongbuaa1 小时前
一些烦人的go设置 goland
开发语言·后端·golang
花心蝴蝶.4 小时前
Spring MVC 综合案例
java·后端·spring
落霞的思绪4 小时前
Redis实战(黑马点评)——关于缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、Redis工具)
数据库·spring boot·redis·后端·缓存
java冯坚持4 小时前
shiro学习五:使用springboot整合shiro。在前面学习四的基础上,增加shiro的缓存机制,源码讲解:认证缓存、授权缓存。
spring boot·学习·缓存
m0_748255655 小时前
环境安装与配置:全面了解 Go 语言的安装与设置
开发语言·后端·golang
SomeB1oody9 小时前
【Rust自学】14.6. 安装二进制crate
开发语言·后端·rust
患得患失94911 小时前
【Django DRF Apps】【文件上传】【断点上传】从零搭建一个普通文件上传,断点续传的App应用
数据库·后端·django·sqlite·大文件上传·断点上传
customer0812 小时前
【开源免费】基于SpringBoot+Vue.JS校园失物招领系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
中國移动丶移不动13 小时前
Java 反射与动态代理:实践中的应用与陷阱
java·spring boot·后端·spring·mybatis·hibernate