SpringBoot集成WebSocket实现后台向前端推送信息的示例

下面我来详细讲解一下“SpringBoot集成WebSocket实现后台向前端推送信息”的完整攻略。

简介

WebSocket是一种在Web浏览器和服务器之间进行双向通信的技术,它可以让Web页面实时获取到服务器端推送的信息,因此它被广泛应用于实时推送、在线聊天、在线游戏等场景。SpringBoot框架对WebSocket进行了良好的支持,可以非常方便地实现后台向前端推送信息的功能。

实现步骤

下面我们来详细介绍一下SpringBoot集成WebSocket实现后台向前端推送信息的步骤。

1. 添加WebSocket依赖

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

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

2. 定义WebSocket配置类

新建一个类,命名为WebSocketConfig,并添加@Configuration和@EnableWebSocket注解。

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

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

    @Bean
    public MyHandler myHandler() {
        return new MyHandler();
    }

}

上述代码中,我们通过WebSocketConfigurer接口的registerWebSocketHandlers方法注册了一个WebSocket处理器,这个处理器的名称为"/myHandler",对应MyHandler类。其中,setAllowedOrigins("*")表示允许跨域访问。

3. 定义WebSocket处理器

新建一个类,命名为MyHandler,继承自TextWebSocketHandler,并实现以下方法:

public class MyHandler extends TextWebSocketHandler {

    private static final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        sessions.add(session);
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session);
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        for (WebSocketSession s : sessions) {
            s.sendMessage(message);
        }
    }

}

上述代码中,我们首先定义了一个sessions列表,用于保存所有已连接的WebSocketSession实例。在afterConnectionEstablished方法中,我们将新的WebSocketSession实例添加到sessions列表中;在afterConnectionClosed方法中,我们将已关闭的WebSocketSession实例从sessions列表中删除;在handleTextMessage方法中,我们遍历sessions列表,将收到的消息通过sendMessage方法发送给所有的WebSocketSession实例。

4. 前端页面接收消息

在前端页面中,可以通过WebSocket连接到MyHandler处理器,从而接收到后台推送的消息。示例代码如下:

<script>
    var socket = new WebSocket("ws://localhost:8080/myHandler");
    socket.onmessage = function(event) {
        console.log(event.data);
    };
</script>

上述代码中,我们通过WebSocket对象的onmessage事件监听后台传来的消息,并将消息写入到控制台中。这样,当后台向前端推送消息时,就会在控制台中输出消息内容。

示例说明

示例一

假设我们现在有一个在线聊天室的需求,聊天室中可以实时接收到其他用户发送的消息。我们可以通过WebSocket和SpringBoot实现这个功能。

具体实现步骤如下:

  1. 添加WebSocket依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
  1. 定义WebSocket配置类:
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(chatHandler(), "/chat").setAllowedOrigins("*");
    }

    @Bean
    public ChatHandler chatHandler() {
        return new ChatHandler();
    }
}
  1. 定义WebSocket处理器:
public class ChatHandler extends TextWebSocketHandler {
    private static final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        sessions.add(session);
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session);
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        for (WebSocketSession s : sessions) {
            s.sendMessage(message);
        }
    }
}
  1. 前端页面接收消息:
<script>
    var socket = new WebSocket("ws://localhost:8080/chat");
    socket.onmessage = function(event) {
        var data = JSON.parse(event.data);
        var message = "[" + data.from + "]: " + data.message;
        var li = document.createElement("li");
        li.innerHTML = message;
        document.getElementById("messages").appendChild(li);
    };

    function send() {
        var message = document.getElementById("message").value;
        var from = document.getElementById("from").value;
        socket.send(JSON.stringify({
            from: from,
            message: message
        }));
        document.getElementById("message").value = "";
    }
</script>

上述代码中,我们定义了一个聊天室的界面,包括输入框、发送按钮和消息列表。当用户输入消息后,点击发送按钮,就会将消息发送给后台的WebSocket处理器MyHandler。而当MyHandler接收到消息后,会将消息发送给所有的WebSocketSession实例,从而广播给所有在线用户。在线用户的页面会实时收到后台传来的消息。

示例二

假设我们现在想要向所有在线用户实时推送某个股票的实时价格。我们可以通过WebSocket和SpringBoot实现这个功能。

具体实现步骤如下:

  1. 添加WebSocket依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
  1. 定义WebSocket配置类:
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(stockHandler(), "/stock").setAllowedOrigins("*");
    }

    @Bean
    public StockHandler stockHandler() {
        return new StockHandler();
    }
}
  1. 定义WebSocket处理器:
public class StockHandler extends TextWebSocketHandler {
    private static final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        sessions.add(session);
        sendPrice(session);
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session);
    }

    private void sendPrice(WebSocketSession session) throws IOException {
        Random random = new Random();
        double price = random.nextDouble() * 100;
        session.sendMessage(new TextMessage(Double.toString(price)));
    }

    @Scheduled(fixedDelay = 1000)
    public void sendPriceToAll() throws IOException {
        for (WebSocketSession session : sessions) {
            sendPrice(session);
        }
    }
}

上述代码中,我们在WebSocket处理器中定义一个sendPrice方法,用于向特定的WebSocketSession实例发送一个随机的股价信息。在afterConnectionEstablished方法中,我们添加新连接的WebSocketSession实例,并且发送一个初始股价信息。在sendPriceToAll方法中,我们将当前的股价信息广播给所有在线的WebSocketSession实例,从而实现实时股价更新的功能。

  1. 前端页面接收消息:
<script>
    var socket = new WebSocket("ws://localhost:8080/stock");
    socket.onmessage = function(event) {
        document.getElementById("price").innerHTML = event.data;
    };
</script>

上述代码中,我们定义了一个页面,用于显示股价信息。当我们连接到StockHandler处理器所在的地址时,就能接收到后台传来的股价信息,并将其实时地显示在页面上。

总结

通过以上示例,我们可以看出SpringBoot集成WebSocket实现后台向前端推送信息非常简单,只需要几行代码就能实现实时推送。通过WebSocket,我们可以轻松地实现实时推送、在线聊天、在线游戏等场景,为我们的Web应用添加更加完善的实时交互功能。

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

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

相关文章

  • 使用threejs实现第一人称视角的移动的问题(示例代码)

    使用threejs实现第一人称视角的移动可以分为以下步骤: 初始化场景和相机 添加光源和地面等元素 监听鼠标和键盘事件 更新相机位置和角度 渲染场景 下面我们来逐步讲解。 1. 初始化场景和相机 在使用threejs之前,需要先在HTML中引入threejs库文件。建议使用在线CDN地址,代码如下: <script src="https://…

    jquery 2023年5月27日
    00
  • jQuery UI Draggable drag 事件

    以下是关于 jQuery UI 的 Draggable drag 事件的详细攻略: jQuery UI Draggable drag 事件 drag 事件在拖动可拖动元素时触发。可以使用该事件在拖动可拖动元素时执行一些操作。 语法 $(selector).draggable({ drag: function(event, ui) { // 在拖动可拖动元素时…

    jquery 2023年5月11日
    00
  • jQWidgets jqxDataTable showColumn()方法

    jQWidgets 是一个流行的 JavaScript UI 库,提供了许多可定制的 UI 组件。其中一个组件是 jqxDataTable,它是用于显示和编辑表格数据的件。jqDataTable 提供多个方法和属性,其中之一是 showColumn()。下面是关于 jqxDataTable 的 showColumn() 方法的详攻略: showColumn(…

    jquery 2023年5月11日
    00
  • jQWidgets jqxLayout minGroupWidth属性

    jQWidgets jqxLayout minGroupWidth属性攻略 简介 jQWidgets 是一个基于 jQuery 的 UI 组件库,提供了丰富的 UI 组件和工具,可于创建代化应程序。jqxLayout 布局组件用于灵活的布局,可用于构建复杂的用户界面。本攻略将详细介绍 jqxLayout 的 minGroupWidth 属性,包括 minGr…

    jquery 2023年5月10日
    00
  • jQuery wrapAll()的应用实例

    当涉及到DOM元素的操作时,jQuery是一个非常常用且实用的JavaScript库。其中,wrapAll()是一种方法,可以将所有匹配的元素用指定的HTML结构包裹起来。 下面,我们将讲解jQuery wrapAll()的应用实例,包括两条示例说明。 一、基本语法 在使用这种方法进行元素包装时,我们需要指定想要用来包裹元素的HTML结构。这个结构可以是一个…

    jquery 2023年5月13日
    00
  • jQWidgets jqxBarcode labelColor属性

    jQWidgets是一个基于jQuery的UI组件库,提供了丰富的UI件和工具,包括表格、图表、表单、历、菜等。其中,jqxBarcode是jQWidgets中的一个码组件,可以用于生成各种类型的条码。jqxBarcode提供了labelColor属性,用于设置条形码标签颜色。本文将详细介绍jqxBarcode的labelColor属性的使用方法和示例。 l…

    jquery 2023年5月9日
    00
  • jQuery Jcrop插件实现图片选取功能

    下面是详细讲解“jQuery Jcrop插件实现图片选取功能”的完整攻略。 什么是jQuery Jcrop插件? jQuery Jcrop插件是一款基于jQuery开发的选择和剪裁图片的插件,支持在图片上添加剪裁框,可以根据用户选择来裁剪图片。 安装jQuery Jcrop插件 下载jQuery Jcrop插件的压缩包,解压后得到jcrop文件夹,将其放置于…

    jquery 2023年5月27日
    00
  • Axios和Jquery实现文件上传功能

    Axios和Jquery均可以实现文件上传功能,下面将分别讲解他们的实现方法。 Axios实现文件上传 Axios是一个基于Promise的HTTP库,可以用于浏览器和Node.js。它可以支持跨域请求,并可以轻松处理文件上传。具体的实现方法如下: 1. 创建表单 在HTML中创建一个表单,用于上传文件。 <form enctype="mul…

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