SpringBoot2.0集成WebSocket实现后台向前端推送信息

下面我将为您详细讲解Spring Boot 2.0集成WebSocket实现后台向前端推送信息的完整攻略。

一、WebSocket简介

WebSocket是一种在单个TCP连接上进行全双工通信的协议。它使得客户端和服务器之间数据的交换变得更加实时和高效。在Web场景中,WebSocket被广泛应用于实时通信、聊天室、在线游戏等领域。

二、Spring Boot 2.0集成WebSocket的步骤

在Spring Boot 2.0中,集成WebSocket非常容易。下面我们来逐步实现。

1.创建Spring Boot项目

使用Spring Initializr快速创建一个Spring Boot项目,选择自己熟悉的构建工具和依赖选项即可。

2.添加WebSocket依赖

在maven的pom.xml文件中添加如下依赖:

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

这个依赖会为我们提供所需的所有WebSocket库和配置。

3.编写WebSocket配置类

在Spring Boot 2.0中,可以使用两种方式来配置WebSocket,分别是注解和Java配置。这里我们使用Java配置来实现WebSocket配置。

新建一个WebSocketConfig类,添加@EnableWebSocket注解启用WebSocket功能,并实现WebSocketConfigurer接口中的registerWebSocketHandlers方法,代码如下:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new WebSocketHandler(), "/ws").setAllowedOrigins("*");
    }
}

其中,WebSocketHandler是我们自己实现的一个WebSocket处理器,后面会详细讲解。

4.编写WebSocket处理器

编写WebSocket处理器,实现WebSocketHandler接口,重写onOpen、onClose、onMessage等方法。这个处理器负责处理与客户端之间的WebSocket连接和交互,因此这里的onMessage方法是和客户端进行交互的核心代码。下面是一个简单的WebSocketHandler实现:

public class WebSocketHandler implements WebSocketHandler {
    private static final Logger logger = LoggerFactory.getLogger(WebSocketHandler.class);

    @Override
    public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {
        logger.info("WebSocket session opened: " + webSocketSession.getId());
    }

    @Override
    public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {
        logger.info("Received message: " + webSocketMessage.getPayload());
    }

    @Override
    public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
        logger.info("WebSocket session closed: " + webSocketSession.getId());
    }
}

5.推送信息到前端

推送信息到前端可以通过WebSocketSession的sendMessage方法实现。我们可以稍加修改之前的WebSocketHandler,实现在onMessage方法中将信息推送给客户端:

public class WebSocketHandler implements WebSocketHandler {
    private static final Logger logger = LoggerFactory.getLogger(WebSocketHandler.class);

    private List<WebSocketSession> sessions = new ArrayList<>();

    @Override
    public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {
        logger.info("WebSocket session opened: " + webSocketSession.getId());
        sessions.add(webSocketSession);
    }

    @Override
    public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {
        logger.info("Received message: " + webSocketMessage.getPayload());

        // 推送消息到前端
        for (WebSocketSession session : sessions) {
            if (session.isOpen()) {
                TextMessage message = new TextMessage("当前时间:" + new Date());
                session.sendMessage(message);
            }
        }
    }

    @Override
    public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
        logger.info("WebSocket session closed: " + webSocketSession.getId());
        sessions.remove(webSocketSession);
    }
}

这里我们在WebSocketHandler中新建了一个sessions数组,用来保存客户端与服务器之间的WebSocketSession会话。在afterConnectionEstablished方法中,将当前会话添加到sessions数组中。在onMessage方法中,遍历sessions数组,向所有客户端推送当前的时间信息。在afterConnectionClosed方法中,从sessions数组中删除会话。

三、示例说明

下面是两个示例说明,分别是前端和后端:

1.前端代码

在HTML页面的JavaScript代码中,使用WebSocket连接服务器,并在onmessage回调中处理接受服务器推送的信息,代码如下:

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Test</title>
    <meta charset="utf-8"/>
</head>
<body>
<h1>WebSocket Test</h1>

<div id="msg"></div>

<script type="text/javascript">
    const webSocket = new WebSocket("ws://localhost:8080/ws");
    webSocket.onmessage = event => {
        let msg = document.getElementById("msg");
        let time = new Date().toLocaleTimeString();
        msg.innerHTML = msg.innerHTML + "<br/>" + "(" + time + ") " + event.data;
    }
</script>
</body>
</html>

2.后端代码

为了方便起见,这里直接提供了整个Spring Boot 2.0集成WebSocket的完整后端代码:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new WebSocketHandler(), "/ws").setAllowedOrigins("*");
    }
}

public class WebSocketHandler implements WebSocketHandler {
    private static final Logger logger = LoggerFactory.getLogger(WebSocketHandler.class);

    private List<WebSocketSession> sessions = new ArrayList<>();

    @Override
    public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {
        logger.info("WebSocket session opened: " + webSocketSession.getId());
        sessions.add(webSocketSession);
    }

    @Override
    public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {
        logger.info("Received message: " + webSocketMessage.getPayload());

        // 推送消息到前端
        for (WebSocketSession session : sessions) {
            if (session.isOpen()) {
                TextMessage message = new TextMessage("当前时间:" + new Date());
                session.sendMessage(message);
            }
        }
    }

    @Override
    public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
        logger.info("WebSocket session closed: " + webSocketSession.getId());
        sessions.remove(webSocketSession);
    }
}

您可以使用浏览器访问上述HTML页面,打开控制台查看日志,也可以使用命令行工具进行测试。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot2.0集成WebSocket实现后台向前端推送信息 - Python技术站

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

相关文章

  • 如何用jQuery检查一个复选框

    使用 jQuery 检查一个复选框,可以使用 prop 或 is 方法。 使用 prop 方法 可以使用 prop 方法获取复选框的属性值,例如,获取选中状态可以使用 prop(‘checked’) 方法,示例代码如下: if ($(‘#checkbox1’).prop(‘checked’)) { console.log(‘checkbox1 被选中了’);…

    jquery 2023年5月13日
    00
  • Underscore.js _.indexBy函数

    Underscore.js是一款JavaScript工具库,它提供了一系列常用的函数和方法,方便我们进行数据处理和逻辑操作。其中,_.indexBy函数是一种非常实用的函数,可以将一个数组或对象数组转换成一个以特定字段为key的对象。 1. 函数格式 _.indexBy函数的格式如下: _.indexBy(list, iteratee, [context])…

    jquery 2023年5月12日
    00
  • jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析

    深拷贝是一种将对象或数组复制到一个新的对象或数组的操作,而且所有嵌套的引用也会被完整复制,而不仅仅是对原始对象的引用。这是一种非常有用的方法,因为它能够在不影响原始对象的情况下进行修改,同时保持整个复制对象的完整性。在JavaScript中,深拷贝可以通过许多不同的方式实现,其中jQuery提供了一个名为$.extend()的方法来实现深拷贝操作。 jQue…

    jquery 2023年5月28日
    00
  • jQWidgets jqxSwitchButton uncheck()方法

    下面我们来详细讲解一下”jQWidgets jqxSwitchButton uncheck()方法”的使用攻略。 什么是jqxSwitchButton? jqxSwitchButton是基于jQuery和jQWidgets的开关按钮插件,能够很轻松地创建一个开关按钮。 uncheck()方法是什么? uncheck()方法是jqxSwitchButton插件…

    jquery 2023年5月12日
    00
  • jQWidgets jqxButton textPosition属性

    jQWidgets jqxButton textPosition属性详解 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件工具包。jqxButton是其中之一。本文将详细介绍jqxButton的textPosition属性,包括定义、语法和示例。 textPosition属性的定义 jqxButton的textPosition用于设置…

    jquery 2023年5月10日
    00
  • JS和jQuery通过this获取html标签中的属性值(实例代码)

    获取html标签中属性值是前端常见的操作之一。在JavaScript和jQuery中,使用this关键字可以获取到当前元素,通过this就可以方便地获取到当前元素中的属性值。 下面是使用JavaScript和jQuery分别获取html标签属性值的示例代码: 使用JavaScript获取html标签属性值 在JavaScript中,可以使用this关键字来获…

    jquery 2023年5月27日
    00
  • jQuery contents()的例子

    以下是关于jQuery中contents()方法的完整攻略: 什么是contents()方法? contents()方法是jQuery中的一个方法,用于选择匹配元素的所有子节点,包括文本节点和注释节点。 如何使用contents()方法? 使用以下代码使用contents()方法: $(selector).contents() 其中,selector是要选择…

    jquery 2023年5月12日
    00
  • jQWidgets jqxToolBar工具属性

    以下是关于 jQWidgets jqxToolBar 组件中工具属性的详细攻略。 jQWidgets jqxToolBar 工具属性 jQWidgets jqxToolBar的工具用于设置工具栏中的工具。您可以使用该属性来添加、删除、禁用、启用和更改工具栏中的工具。 语法 $(‘#toolbar’).jqxToolBar(‘addTool’, tool); …

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