SpringBoot集成WebSocket实现前后端消息互传的方法

下面是 SpringBoot 集成 WebSocket 实现前后端消息互传的完整攻略。

简介

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。WebSocket 使得浏览器和服务器之间的实时通信变得更加容易。Spring Boot 提供了一个强大的 WebSocket 模块,可以轻松实现 WebSocket 的集成。

示例1:实现前后端简单文字消息互传

1. 添加依赖

在 pom.xml 添加以下依赖:

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

2. 配置 WebSocket

在 Spring Boot 中,WebSocket 的配置非常简单,只需添加一个 @Configuration 类,然后在该类中添加 @Bean 方法,用于配置默认的 Spring Boot WebSocket 配置。

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyHandler(), "/myHandler");
    }

    class MyHandler extends TextWebSocketHandler {

        private WebSocketSession session;

        @Override
        public void afterConnectionEstablished(WebSocketSession session) throws Exception {
            this.session = session;
            System.out.println("Connected");
        }

        @Override
        protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
            String payload = message.getPayload();
            System.out.println("Received message: " + payload);
            session.sendMessage(new TextMessage("Echo: " + payload));
        }

        @Override
        public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
            System.out.println("Disconnected");
        }

    }

}

在上述示例中,首先我们定义了一个 MyHandler 类,继承了 TextWebSocketHandler,并重写了其中的三个方法。这三个方法分别用于处理 WebSocket 连接建立、文本消息接收和连接关闭事件。

在 MyHandler 中,我们将收到的消息原样返回("Echo: " + payload),用于测试 WebSocket 的连接是否成功。最后,在 registerWebSocketHandlers 方法中,我们将 MyHandler 类添加到指定的 WebSocketHandlerRegistry 中("/myHandler")。

3. 编写前端页面

在 index.html 页面中,添加以下代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>WebSocket Test</title>
    <script src="/js/jquery.js"></script>
    <script src="/js/stomp.min.js"></script>
    <script>
        var myWebSocket = new WebSocket("ws://" + window.location.host + "/myHandler");
        myWebSocket.onopen = function (event) {
            console.log("WebSocket opened");
        };
        myWebSocket.onmessage = function (event) {
            var message = event.data;
            $("#messages").append("<li>" + message + "</li>");
        };
        $(function () {
            $("#sendBtn").click(function () {
                var message = $("#messageInput").val();
                myWebSocket.send(message);
                $("#messageInput").val("");
            });
        });
    </script>
</head>
<body>
    <h1>WebSocket Test</h1>
    <ul id="messages"></ul>
    <div>
        <label for="messageInput">Message:</label>
        <input type="text" id="messageInput" />
        <button type="button" id="sendBtn">Send</button>
    </div>
</body>
</html>

在上述示例中,我们首先创建一个 WebSocket 对象,并连接到指定的服务端路径("ws://" + window.location.host + "/myHandler")。接着,我们在 onopenonmessage 事件中分别定义 WebSocket 连接成功和接收消息的处理逻辑。

在页面中,添加一个文本框和按钮用于发送消息,在按钮的 click 事件中,我们将文本框中的内容通过 WebSocket 对象发送给服务端,然后清空文本框。

4. 启动应用程序

启动 Spring Boot 应用程序,访问 http://localhost:8080/index.html 即可。在文本框中输入消息并点击 Send 按钮,即可在页面上看到返回的消息(添加了前缀 "Echo: ")。

示例2:实现前后端简单点赞功能

1. 添加依赖

在 pom.xml 添加以下依赖:

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

2. 配置 WebSocket

在 Spring Boot 中,WebSocket 的配置非常简单,只需添加一个 @Configuration 类,然后在该类中添加 @Bean 方法,用于配置默认的 Spring Boot WebSocket 配置。

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    private static Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyHandler(), "/myHandler");
    }

    class MyHandler extends TextWebSocketHandler {

        private WebSocketSession session;

        @Override
        public void afterConnectionEstablished(WebSocketSession session) throws Exception {
            this.session = session;
            sessions.put(session.getId(), session);
            System.out.println("Connected");
        }

        @Override
        protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
            String payload = message.getPayload();
            System.out.println("Received message: " + payload);
            for (WebSocketSession s : sessions.values()) {
                if (s.isOpen()) {
                    s.sendMessage(new TextMessage(payload));
                }
            }
        }

        @Override
        public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
            sessions.remove(session.getId());
            System.out.println("Disconnected");
        }

    }

}

在上述示例中,首先我们定义了一个 MyHandler 类,该类继承了 TextWebSocketHandler,并重写了其中的三个方法。这三个方法分别用于处理 WebSocket 连接建立、文本消息接收和连接关闭事件。

在 MyHandler 中,我们定义了一个静态成员变量 sessions,用于存储所有连接的 WebSocketSession。在 afterConnectionEstablished 方法中,我们将当前连接加入到 sessions 中。在 handleTextMessage 方法中,我们将接收到的消息广播给所有连接的 WebSocketSession(除了发送者自己)。在 afterConnectionClosed 方法中,我们将当前连接从 sessions 中删除。

registerWebSocketHandlers 方法中,我们将 MyHandler 类添加到指定的 WebSocketHandlerRegistry 中("/myHandler")。

3. 编写前端页面

在 index.html 页面中,添加以下代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>WebSocket Test</title>
    <script src="/js/jquery.js"></script>
    <script src="/js/stomp.min.js"></script>
    <script>
        var myWebSocket = new WebSocket("ws://" + window.location.host + "/myHandler");
        myWebSocket.onopen = function (event) {
            console.log("WebSocket opened");
        };
        myWebSocket.onmessage = function (event) {
            var message = event.data;
            $("#votes").text(message);
        };
        $(function () {
            $("#voteBtn").click(function () {
                var message = "vote";
                myWebSocket.send(message);
                $("#voteBtn").attr("disabled", true);
            });
        });
    </script>
</head>
<body>
    <h1>WebSocket Test</h1>
    <p>
        Votes: <span id="votes">0</span>
    </p>
    <button type="button" id="voteBtn">Vote</button>
</body>
</html>

在上述示例中,我们首先创建一个 WebSocket 对象,并连接到指定的服务端路径("ws://" + window.location.host + "/myHandler")。接着,我们在 onopenonmessage 事件中分别定义 WebSocket 连接成功和接收消息的处理逻辑。

在页面中,添加一个按钮用于投票,在按钮的 click 事件中,我们将一个 "vote" 字符串通过 WebSocket 对象发送给服务端,然后将按钮变为不可点击状态。

4. 启动应用程序

启动 Spring Boot 应用程序,访问 http://localhost:8080/index.html 即可。在页面中点击 Vote 按钮,即可看到投票数的变化(通过 WebSocket 广播到所有连接的 WebSocketSession)。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot集成WebSocket实现前后端消息互传的方法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 总结十个实用但偏执的Java编程技术

    我可以为您讲解一下“总结十个实用但偏执的Java编程技术”的完整攻略。 1. 简介 在实际的Java编程中,有许多技巧可以提高代码的性能和可维护性。然而,有些技巧看起来可能有点反直觉,甚至偏执,但却可以让我们写出更加高效和可靠的代码。 本文总结神奇但实用的十个Java技巧,每个技巧都包括示例代码,可以帮助读者更好地理解和掌握这些技术。 2. 使用String…

    Java 2023年5月23日
    00
  • java连接mysql底层封装详解

    Java连接MySQL是Java Web开发中最重要的一个环节。为了方便开发,我们通常会使用Maven或Gradle等构建工具引入一些常用的Java数据库连接库,如JDBC或MyBatis等。这些库本质上都是对Java JDBC API的封装,它们封装了大量的底层API,使我们能够更加方便地操作数据库。本文将围绕着Java连接MySQL展开,对其底层封装进行…

    Java 2023年5月19日
    00
  • spring boot使用thymeleaf模板的方法详解

    下面为您提供《Spring Boot使用Thymeleaf模板的方法详解》的完整攻略。 1. Thymeleaf简介 Thymeleaf是一种现代的服务器端Java模板引擎,可以构建HTML、XML、JavaScript、CSS或文本输出。它旨在与Spring框架完全集成,但可以用于处理任何Web和非Web应用程序开发的模板需要。 2. Spring Boo…

    Java 2023年6月15日
    00
  • Spring Security权限控制的实现接口

    Spring Security是一个基于Spring框架的安全框架,用于实现用户认证(authentication)和授权(authorization)等安全功能。其中,权限控制是Spring Security的一个重要特性,可以通过编写实现接口来对系统中不同的资源进行授权控制。下面是完整的Spring Security权限控制实现接口攻略: 一、Sprin…

    Java 2023年6月3日
    00
  • Java synchronized底层实现原理以及锁优化

    Java中的synchronized关键字用于保证同步访问,避免出现多线程并发访问共享资源的问题,保证程序的正确性和一致性。在JVM中,synchronized的实现原理是通过Java对象头中的一个有关锁的标识位来实现的,具体的底层实现原理如下: Java对象头 Java对象在堆中的数据结构是由对象头和实例数据两部分组成的,其中对象头占用了8个或者12个字节…

    Java 2023年5月26日
    00
  • spring-boot-autoconfigure模块用法详解

    Spring Boot Autoconfigure 模块用法详解 在本文中,我们将详细讲解 Spring Boot Autoconfigure 模块的用法。我们将使用 Spring Boot 2.5.0 版本的源码进行分析。 什么是 Spring Boot Autoconfigure 模块? Spring Boot Autoconfigure 模块是 Spr…

    Java 2023年5月15日
    00
  • Mybatis Plus 逆向工程介绍

    下面是完整攻略,首先我们来讲解一下Mybatis Plus 逆向工程的概念: 什么是Mybatis Plus逆向工程 Mybatis Plus是一个优秀的Mybatis增强工具,Mybatis Plus逆向工程是一种通过数据库表反向生成对应的Mybatis Plus实体、mapper、mapper.xml等代码文件的技术,可以在一定程度上减少程序员的手动开发…

    Java 2023年5月20日
    00
  • java实现字符串反转案例

    首先,在Java中,String类是不可变的,意味着反转字符串不会改变原字符串,而是产生一个新的字符串。下面是反转字符串的步骤: 1.将字符串转换成字符数组。2.使用双指针方法交换字符数组中的字符顺序。3.将字符数组转换回字符串。 以下是完整的Java代码示例: public class StringReverseExample { public stati…

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