Spring boot项目整合WebSocket方法

下面是关于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日

相关文章

  • 极力推荐10个短小实用的JavaScript代码段

    接下来我来为大家讲解极力推荐10个短小实用的JavaScript代码段的攻略。 一、介绍 首先我们需要明确,这10个短小实用的JavaScript代码段主要是针对于前端开发者,能够帮助他们提高开发效率、优化用户体验、提供更好的交互和视觉效果。 这10个代码段分别是:1. 获取URL参数2. 倒计时3. 防抖4. 节流5. 数组去重6. 判断数组是否相等7. …

    JavaScript 2023年5月18日
    00
  • 一个写得较好的JavaScript日期挑选控件

    当我们需要在网站中使用日期选择控件时,一个好的JavaScript日期挑选控件可以极大地帮助我们提高开发效率和用户体验。在使用JavaScript日期控件之前,我们需要考虑以下几个因素: 控件的易用性 控件的可定制性 控件的兼容性 在选择JavaScript日期控制器之前,需要仔细考虑以上因素,以确定控件的选择是否适合我们的需求。 以下是一个基于jQuery…

    JavaScript 2023年6月10日
    00
  • JSDoc 介绍使用规范JsDoc的使用介绍

    下面是关于JSDoc的完整攻略。 JSDoc 介绍 JSDoc是一个用于生成JavaScript代码文档的工具,它基于JavaScript的文档注释来生成文档。JSDoc支持多种标记,并且可以生成HTML、Markdown等多种格式的文档,因此广泛应用于JavaScript项目的文档生成中。 使用规范 以下是一些JSDoc的使用规范: 常见标记 @param…

    JavaScript 2023年5月27日
    00
  • JSON+Jquery省市区三级联动

    JSON+Jquery省市区三级联动的完整攻略如下: 简介 JSON+Jquery省市区三级联动是一种实现省市区三级联动的前端技术。通过JSON文件存储省市区信息,利用Jquery编写前端代码实现三级联动效果。该技术已广泛应用于各类网站和APP中。 实现步骤 步骤一:准备JSON数据 首先,需要准备一份含有所有省市区信息的JSON数据文件。该文件中包含省市区…

    JavaScript 2023年5月27日
    00
  • 超详细教程实现Vue底部导航栏TabBar

    接下来我会详细讲解实现Vue底部导航栏TabBar的完整攻略。 简介 Vue底部导航栏TabBar,在很多移动端应用或者网站中都是常用的布局,因此在Vue中实现这样的底部导航栏也是很常见的需求。本篇文章将详细介绍如何使用Vue实现底部TabBar并进行相应的样式控制。 实现步骤 安装 vue-router 命令:npm install vue-router …

    JavaScript 2023年6月11日
    00
  • 浅析JS中常用类型转换及运算符表达式

    浅析JS中常用类型转换及运算符表达式 类型转换 显式类型转换 字符串转换 使用toString()、String()函数将其他类型转为字符串类型,或使用+运算符将其他类型与字符串拼接即可: var num1 = 123; console.log(num1.toString()); // "123" console.log(String(n…

    JavaScript 2023年5月28日
    00
  • event.srcElement 用法笔记e.target

    event.srcElement 和 e.target 都是指向事件触发的DOM元素的属性。在不同的浏览器中,其名称和行为可能略有不同,但作用是一样的。 在现代浏览器中,我们应该用 e.target 代替 event.srcElement。下面是两个例子,演示了如何使用这两个属性: 使用 event.srcElement document.addEventL…

    JavaScript 2023年6月10日
    00
  • layui原生表单验证的实例

    下面我来详细讲解一下“layui原生表单验证的实例”的完整攻略。 简介 layui是一款经典的前端UI框架,提供了丰富的组件和插件,其中包括表单验证组件。通过layui原生的表单验证可实现表单的实时验证、提交前的总体验证等功能。 示例1 假设我们有一个简单的表单,包含了姓名(name)、年龄(age)、邮箱(email)、密码(password)这四个输入项…

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