Spring boot项目整合WebSocket方法

yizhihongxing

下面是关于Spring boot整合WebSocket的完整攻略。

环境准备

  1. JDK 1.8及以上版本
  2. Maven 3.2及以上版本
  3. Spring Boot 2.x版本
  4. IDE:Eclipse、IDEA

依赖配置

在Spring Boot项目中开启WebSocket功能需要引入相关依赖,添加以下依赖到项目的pom.xml文件中:

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

WebSocket配置

自定义WebSocket处理器

自定义一个Websocket处理器来处理WebSocket连接和消息:

@Component
public class MyWebSocketHandler extends TextWebSocketHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(MyWebSocketHandler.class);

    // 保存在线用户列表
    private static final Map<String, WebSocketSession> USERS = new ConcurrentHashMap<>();

    // 添加一个新用户到在线列表
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        String username = (String) session.getAttributes().get("username");
        LOGGER.info("新用户 {} 加入聊天室", username);
        USERS.put(username, session);
    }

    // 处理用户发送的消息
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        LOGGER.info("收到用户 {} 发送的消息:{}", session.getAttributes().get("username"), message.getPayload());
        sendMessageToAllUsers(session, message.getPayload()); // 群发消息
    }

    // 从在线列表中删除用户并断开WebSocket连接
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        String username = (String) session.getAttributes().get("username");
        LOGGER.info("用户 {} 离开聊天室,断开WebSocket连接", username);
        USERS.remove(username);
    }

    // 群发消息
    private void sendMessageToAllUsers(WebSocketSession fromUser, String message) throws IOException {
        TextMessage textMessage = new TextMessage(message);
        for (Map.Entry<String, WebSocketSession> entry : USERS.entrySet()) {
            WebSocketSession session = entry.getValue();
            if (!session.isOpen()) {
                continue;
            }
            if (session == fromUser) {
                continue;
            }
            session.sendMessage(textMessage);
        }
    }
}

WebSocket配置类

定义一个WebSocket配置类来设置WebSocket的相关信息:

@Configuration
@EnableWebSocket
public class MyWebSocketConfig implements WebSocketConfigurer {

    @Autowired
    private MyWebSocketHandler myWebSocketHandler;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myWebSocketHandler, "/ws").setAllowedOrigins("*"); // 配置WebSocket端点,允许跨域访问
    }
}

Controller层

在Controller层中添加一个方法来接收WebSocket连接,并将用户信息存储在WebSocketSession中:

@Controller
public class UserController {

    @GetMapping("/login")
    public String login(String username, HttpServletRequest request) {
        request.getSession().setAttribute("username", username); // 将username保存到session中
        return "chat";
    }

    @Autowired
    private SimpMessagingTemplate messagingTemplate;

    // 处理WebSocket连接请求
    @MessageMapping("/send")
    public void handleWebSocketMessage(Principal principal, ChatMessage message) throws Exception {
        String fromUser = principal.getName(); // 获取发送者的用户名
        String toUser = message.getToUser();
        if (StringUtils.isBlank(toUser)) {
            messagingTemplate.convertAndSend("/topic/public", new ChatMessage(fromUser, message.getContent())); // 广播消息
        } else {
            messagingTemplate.convertAndSendToUser(toUser, "/queue/message", new ChatMessage(fromUser, message.getContent())); // 指定用户发送消息
        }
    }
}

页面展示

使用JSP页面来展示聊天页面,用户在登录页面输入用户名后,跳转到聊天室页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Spring Boot WebSocket Demo</title>
    <style>
        .messageForm {
            display: flex;
            margin-bottom: 10px;
        }

        .messageInput {
            flex-grow: 1;
            margin-right: 5px;
        }

        .messageButton {
            width: 80px;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Spring Boot WebSocket Demo</h1>
        <hr/>
        <h2>Welcome <%=session.getAttribute("username")%></h2>
        <div id="chatBox">
        </div>
        <div class="messageForm">
            <input type="text" id="messageInput" class="messageInput" placeholder="请输入你的消息...">
            <button type="button" class="messageButton" onclick="sendMessage()">发送</button>
        </div>
    </div>
    <script src="/webjars/jquery/3.3.1/jquery.min.js"></script>
    <script src="/webjars/sockjs-client/1.3.0/sockjs.min.js"></script>
    <script src="/webjars/stomp-websocket/2.3.3/stomp.min.js"></script>
    <script>
        // 连接WebSocket服务器
        var stompClient = Stomp.over(new SockJS('/ws'));
        stompClient.connect({}, function (frame) {
            console.log('Connected: ' + frame);
            stompClient.subscribe('/user/queue/message', function (response) {
                showMessage(JSON.parse(response.body));
            });
            stompClient.subscribe('/topic/public', function (response) {
                showMessage(JSON.parse(response.body));
            });
        });

        // 显示消息
        function showMessage(message) {
            var $chatBox = $('#chatBox');
            var $messageDiv = $('<div></div>');
            $messageDiv.html(message.fromUser + ' : ' + message.content);
            $chatBox.append($messageDiv);
        }

        // 发送消息
        function sendMessage() {
            var $messageInput = $('#messageInput');
            var message = $messageInput.val();
            $messageInput.val('');
            stompClient.send("/app/send", {}, JSON.stringify({'content': message}));
        }
    </script>
</body>
</html>

示例1:测试广播消息

假设我们有三个用户A、B、C登录到聊天室:

  • 用户A在聊天窗口输入"Hello, everyone!",发送广播消息;
  • 用户B、C将收到该消息。

示例2:测试点对点消息

假设我们有两个用户A、B登录到聊天室:

  • 用户A在聊天窗口输入"@B Hello, B!",发送点对点消息;
  • 用户B将收到该消息。

以上就是完整的Spring Boot项目整合WebSocket方法的攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring boot项目整合WebSocket方法 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • C#多线程数组模拟socket

    C#多线程数组模拟socket是一种基于多线程的应用程序员技术,它可以模拟网络应用程序在网络上的传输过程。以下是详细的攻略。 1. 创建数组 首先,我们需要创建一个数组来存储模拟的socket数据。在C#中,创建数组可以使用以下代码: byte[] data = new byte[1024]; 这里我们创建了一个长度为1024的byte数组,用于存储sock…

    JavaScript 2023年5月28日
    00
  • 如何将一个String和多个String值进行比较思路分析

    当我们需要将一个 String 和多个 String 值进行比较时,可以采用以下步骤: 遍历所有的 String 值,对每个值进行比较 使用 equals() 方法判断当前值是否等于目标 String 如果等于,表示匹配成功,执行相应的操作;如果不等于,继续比较其他值 示例1: 假设我们需要判断用户输入的颜色值是否为预设的几种颜色之一,预设的颜色有红、绿、蓝…

    JavaScript 2023年6月10日
    00
  • JS之Date对象和获取系统当前时间详解

    当我们开发网站时,经常需要操作时间。JavaScript中提供了Date对象,可以方便地进行时间相关的操作。 Date对象 Date对象可以获取当前时间,也可以设置指定时间,提供了很多方法操作时间。 获取当前时间 获取当前时间可以使用Date对象的构造函数不传递任何参数,也可以使用now方法。 // 使用构造函数获取当前时间 let now1 = new D…

    JavaScript 2023年5月27日
    00
  • javascript 数组排序函数

    当我们需要对 JavaScript 数组进行排序时,可以使用 JavaScript 数组提供的排序函数。这个排序函数的具体使用方法,以及有哪些可选参数等,本文会进行详细讲解。 JavaScript 数组排序函数 sort() 方法 sort() 方法是 JavaScript 数组提供的排序函数。使用该函数可以实现对数组中元素的排序,可以对字符串,数字及其他类…

    JavaScript 2023年5月27日
    00
  • 跟我学习javascript的严格模式

    接下来我将为大家详细介绍“跟我学习JavaScript的严格模式”的完整攻略。 什么是严格模式 严格模式是JavaScript的一种运行模式,通过严格模式可以对代码的执行进行限制,使代码更加严谨,减少出错的可能性。在ES5中, JavaScript引入了严格模式概念,它是一组限制 JavaScript语言的特性。在严格模式中,一些在正常模式中默许的行为,会被…

    JavaScript 2023年6月10日
    00
  • JS创建或填充任意长度数组的小技巧汇总

    我来为您详细讲解“JS创建或填充任意长度数组的小技巧汇总”的完整攻略。 标题 JS创建或填充任意长度数组的小技巧汇总 简介 数组(Array)是JavaScript中一个非常常用的数据类型,通过数组我们可以存储一组相关的数据,并且可以通过索引进行访问。但是,在实际编程中,我们经常会遇到一些需求,比如需要创建固定长度的数组或者需要填充任意长度的数组,这时就需要…

    JavaScript 2023年5月27日
    00
  • javascript控制Div层透明属性由浅变深由深变浅逐渐显示

    要实现”JavaScript控制DIV层透明属性由浅变深由深变浅逐渐显示”,可以通过以下步骤实现: 创建一个DIV层并设置CSS样式,包括宽度,高度,背景颜色、位置等信息。如下所示: “`html “` 在JavaScript代码中获取该DIV层对象。 javascript var myDiv = document.getElementById(“myD…

    JavaScript 2023年6月11日
    00
  • js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器 原创

    实现将文本框的内容保存为本地文件可以使用 Blob + URL 或 FileSaver.js 两种方式来兼容多种浏览器。 使用 Blob + URL 首先,获取文本框内容: javascript var text = document.getElementById(‘text’).value; 然后,新建 Blob 对象并设置 MIME 类型: javasc…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部