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

yizhihongxing

下面是 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语法基础之循环结构语句详解 简介 循环结构是编程语言中非常重要的一部分,可以让程序轻松地重复执行特定的任务,提高代码的复用性和效率。Java 语言支持多种循环结构语句,其中包括 for、while 和 do-while 三种类型。在本篇文章中,我们将详细介绍循环结构语句在 Java 语言中的应用。 for 循环 for 循环语句是 Java 语言中最…

    Java 2023年5月23日
    00
  • Spring Security自定义认证器的实现代码

    下面是Spring Security自定义认证器的实现的完整攻略,包含了两个示例。 1. 自定义认证器简介 Spring Security是一个强大的安全框架,可以帮助我们实现各种安全功能。其中认证是Spring Security最基本的功能之一,它可以防止未经授权的用户访问受保护的资源,保护应用程序的安全。 Spring Security默认提供了基于用户…

    Java 2023年5月20日
    00
  • java后端合成图片的实现示例

    来讲一讲“Java后端合成图片的实现示例”的攻略吧。 1. 背景与介绍 有时候我们网站需要用户上传图片并合成一张新的图片,这时候就需要使用Java后端来完成图片合成的工作。在本文中,我们将介绍如何使用Java后端来合成图片,以及示例代码的详细实现和说明。 2. 实现步骤 2.1 准备工作 安装Java开发环境 使用Java库合成图片 理解图片的像素和坐标 熟…

    Java 2023年5月19日
    00
  • Java的MyBatis框架中对数据库进行动态SQL查询的教程

    当我们使用MyBatis框架进行数据访问时,往往需要动态构建SQL语句来满足一些特殊需求。MyBatis提供了许多动态SQL构建方法,使得我们可以非常方便地构建动态SQL语句。 本教程将介绍Java中使用MyBatis框架进行动态SQL构建的方法。 一、条件判断语句 在MyBatis中可以使用if、choose、when、otherwise等语句进行条件判断…

    Java 2023年5月20日
    00
  • Java实现二叉树的建立、计算高度与递归输出操作示例

    一、建立二叉树 首先定义二叉树节点的数据结构:Node class Node { int value; // 节点值 Node left; // 左子树节点 Node right; // 右子树节点 public Node(int value) { this.value = value; left = null; right = null; } } 使用递归…

    Java 2023年5月19日
    00
  • jsp js鼠标移动到指定区域显示选项卡离开时隐藏示例

    针对这个问题,我们可以通过以下步骤来实现: 编写HTML结构 在HTML中,我们需要先定义选项卡的容器和其各自的内容块,然后通过一些特定的属性(例如id、class等)来标记它们,方便后续的JS代码操作。具体代码如下所示: <div id="tab-container"> <div class="tab-ite…

    Java 2023年6月15日
    00
  • Java中判断对象是否相等的equals()方法使用教程

    当我们在Java中处理对象时,判断两个对象是否相等(equality)是一个很普遍的问题,《Java中判断对象是否相等的equals()方法使用教程》提供了一个详细的攻略,帮助我们更好地理解在Java中使用equals()方法。 一、如何判断对象是否相等 在Java中,判断对象是否相等并不能简单地使用“==”运算符。在Java中,对象实际上是存储在内存中的,…

    Java 2023年5月26日
    00
  • Spring boot2+jpa+thymeleaf实现增删改查

    以下是详细讲解“Spring boot2+jpa+thymeleaf实现增删改查”的完整攻略。 1. 准备工作 在开始实现增删改查功能之前,我们需要进行一些准备工作。 1.1 创建Spring Boot工程 首先,我们需要创建一个Spring Boot工程,在这里可以使用Spring Initializr快速创建一个基础工程。在创建工程的过程中需要添加依赖S…

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