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日

相关文章

  • Underscore.js _.indexBy函数

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

    jquery 2023年5月12日
    00
  • jQWidgets jqxSlider incrementValue()方法

    JQWidgets库是一款非常常用的JavaScript UI库,它提供了很多UI组件,其中包括了一个高度可定制化的Slider控件——jqxSlider。jqxSlider控件除了具有基本滑动功能以外,还支持很多高级操作,比如增加或减少当前的Slider值,就可以使用jqxSlider控件提供的incrementValue()方法。 incrementVa…

    jquery 2023年5月11日
    00
  • jQWidgets jqxComboBox clear()方法

    jQWidgets 的 jqxComboBox 组件提供了 clear() 方法,用于清除下拉列表中的所有选项。本文将详细介绍 clear() 方法的使用方法,包括概述、示例以及注意事项。 clear() 方法概述 clear() 方法用于清除下拉列表中的所有选项。 clear() 方法示例 下面是两个示例,如何使用 clear() 方法: 示例1:清除下拉…

    jquery 2023年5月11日
    00
  • 如何使用jQuery Mobile创建一个文件输入

    下面我将详细讲解如何使用jQuery Mobile来创建一个文件输入。步骤如下: 创建一个基础网页 首先,在你的编辑器中创建一个HTML文件,并在<head>标签内引入jQuery和jQuery Mobile的CDN链接,示例如下: <!DOCTYPE html> <html> <head> <meta …

    jquery 2023年5月12日
    00
  • jQuery中live()方法用法实例

    jQuery中live()方法用法实例 live()方法是jQuery中一种用于事件委托的方法,其能够对动态添加的节点绑定事件,使用也很简单。 语法 $(selector).live(event, function) event参数是要绑定的事件类型,例如click、mouseover等。 用法示例 示例1:给动态添加的按钮绑定点击事件 <button…

    jquery 2023年5月28日
    00
  • jQuery AJAX实现调用页面后台方法

    下面详细讲解jQuery AJAX实现调用页面后台方法的完整攻略。 什么是jQuery AJAX jQuery AJAX是一种用于异步加载数据的技术,可以在不刷新整个页面的情况下,向服务器发送请求并获取返回的数据,从而在页面上实现动态加载和更新数据的效果。 实现步骤 实现jQuery AJAX调用后台方法的步骤如下: 在页面中引入jQuery库文件。 在页面…

    jquery 2023年5月28日
    00
  • jQWidgets jqxEditor 本地化属性

    jQWidgets jqxEditor 本地化属性 jQWidgets是一个基于jQuery的UI组件库,提供了丰富的UI件和工具,包括表格、日历、下拉菜单等。jqxEditor是jQWidgets中的一个富文本器组件,用于创建富文本编辑器。localization属性是jqxEditor`中的一个属性,用于设置富文本编辑器的本地化。 localizatio…

    jquery 2023年5月9日
    00
  • jquery为页面增加快捷键示例

    jQuery是一个非常强大的JavaScript库,帮助开发者轻松地实现各种交互效果和优化操作。jQuery也提供了一系列的API来实现对快捷键的监听和响应,为网页的用户操作带来了更加便利的体验。 以下是实现网页快捷键的攻略: 一、确定快捷键和响应事件 在jQuery中,我们可以通过keyup()函数来实现监听键盘上的按键事件,然后根据用户的设置,来对指定的…

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