springboot 使用websocket技术主动给前端发送消息的实现

以下是详细的攻略。

1. WebSocket简介

WebSocket是一种在单个TCP连接上进行全双工通信的协议。它使得客户端和服务器之间可以双向通信,可以实现实时通信、弹幕等功能。

2. springboot使用WebSocket发送消息的实现

2.1 添加依赖

在pom.xml文件中添加WebSocket的依赖:

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

2.2 编写配置类

编写WebSocket的配置类,使得SpringBoot可以支持WebSocket:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        // 配置WebSocket消息的前缀,统一用“/app”前缀表示
        registry.setApplicationDestinationPrefixes("/app");

        // 配置订阅消息的前缀,统一用“/topic”前缀表示
        registry.enableSimpleBroker("/topic");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        // 配置WebSocket的端点,这里使用“/chat”作为端点,客户端连接时使用该端点
        registry.addEndpoint("/chat").withSockJS();
    }
}

2.3 编写Controller类

在Controller中处理消息的发送,以及接收:

@Controller
public class WebSocketController {

    // 使用@MessageMapping来接收客户端发送的消息,同时使用@SendTo来将消息转发给客户端
    @MessageMapping("/sendMsg")
    @SendTo("/topic/msg")
    public String sendMsg(String msg) {
        return msg;
    }

    // 用于和前端建立连接的方法
    @GetMapping("/websocket")
    public String websocket() {
        return "websocket";
    }
}

其中,@MessageMapping用于接收客户端发送的消息,@SendTo则是将消息转发给客户端。这里的“/topic/msg”表示订阅了“/topic/msg”消息的客户端都能够接收到该消息。

2.4 编写前端页面

前端使用websocket连接服务器,发送消息。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试WebSocket</title>
    <script src="https://cdn.bootcss.com/stomp.js/2.3.3/stomp.js"></script>
    <script src="https://cdn.bootcss.com/sockjs-client/1.3.0/sockjs.min.js"></script>
</head>
<body>
<input type="text" id="sendMsgValue">
<button onclick="sendMsg()">发送</button>
<div id="msgDiv"></div>

<script>
    var stompClient = null;

    // 建立连接
    function connect() {
        var socket = new SockJS('/chat');
        stompClient = Stomp.over(socket);
        stompClient.connect({}, function (frame) {
            console.log('Connected: ' + frame);
            stompClient.subscribe('/topic/msg', function (response) {
                showMessage(response.body);
            });
        });
    }

    // 断开连接
    function disconnect() {
        if (stompClient !== null) {
            stompClient.disconnect();
        }
        console.log('Disconnected');
    }

    // 发送消息
    function sendMsg() {
        var msg = document.getElementById("sendMsgValue").value;
        stompClient.send("/app/sendMsg", {}, msg);
    }

    // 显示消息
    function showMessage(message) {
        document.getElementById("msgDiv").innerHTML += message + "<br>";
    }

    connect();
</script>
</body>
</html>

其中,通过stomp.js和sockjs实现了WebSocket的连接和消息发送,前端使用“/chat”作为端点建立连接后,订阅了“/topic/msg”消息,用于接收来自服务器推送的信息。

发送消息时,调用stompClient的send方法,传入发送的消息。

至此,完成了向前端发送消息的操作。

3. 示例说明

3.1 示例1

以下代码演示了如何向订阅了“/topic/msg”消息的客户端主动发送消息:

@RestController
@RequestMapping("/websocket")
public class WebSocketController {

    @Autowired
    private SimpMessagingTemplate simpMessagingTemplate;

    @PostMapping("/send")
    public String send(@RequestParam String message) {
        simpMessagingTemplate.convertAndSend("/topic/msg", message);
        return "success";
    }
}

在Controller中使用SimpMessagingTemplate来向订阅了“/topic/msg”消息的客户端发送消息。

3.2 示例2

以下代码演示了如何向指定用户的客户端主动发送消息:

@RestController
@RequestMapping("/websocket")
public class WebSocketController {

    @Autowired
    private SimpMessagingTemplate simpMessagingTemplate;

    @PostMapping("/sendToUser")
    public String sendToUser(@RequestParam String username,
                             @RequestParam String message) {
        simpMessagingTemplate.convertAndSendToUser(username, "/msg", message);
        return "success";
    }
}

在Controller中使用SimpMessagingTemplate的convertAndSendToUser方法,指定要发送消息的用户和频道。注意,此时需要在前端订阅该频道,例如使用“/user/username/msg”来订阅。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot 使用websocket技术主动给前端发送消息的实现 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Docker 容器虚拟化的实用技巧总结

    Docker 容器虚拟化的实用技巧总结 1. Docker 简介 Docker 是一个开源的应用容器引擎,可以方便地将应用程序打包成一个独立的容器,运行于任意的平台上。 2. Docker 容器的基本操作 2.1 容器的创建和启动 容器的创建和启动可以通过以下命令实现: $ docker run <image_name> <command&…

    Java 2023年6月15日
    00
  • jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码

    下面就针对“jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码”的完整攻略进行详细讲解。 1. 简介 ajaxSubmit()是jQuery插件中的一个方法,可以对form表单进行异步上传,常用于表单提交过程中使用,同时也可以进行文件上传的操作。在上传文件的过程中,需要将form表单中的数据也一并提交到后台。 2. 示例代码 下面给出一…

    Java 2023年6月15日
    00
  • 如何通过Java监听MySQL数据的变化

    如何通过Java监听MySQL数据的变化? 为了监听MySQL数据的变化,我们可以借助MySQL提供的binlog机制和Java的开源库Canal,来轻松实现对MySQL数据的监听与解析。Canal是阿里巴巴开源的基于binlog的增量订阅&消费组件,用于数据的异构复制和逻辑解析,在大型分布式系统下广泛应用于数据信息同步。 Canal基于阿里中间件团…

    Java 2023年5月20日
    00
  • 使用maven一步一步构建spring mvc项目(图文详解)

    使用 maven 一步一步构建 Spring MVC 项目是一个非常常用的开发方式。下面我们来详细讲解这个步骤: 步骤一:新建maven项目 打开 Eclipse 或者 IntelliJ IDEA ,点击 File -> New -> Maven Project; 在弹出的对话框中,选择 Create a simple project ,并勾选上…

    Java 2023年5月16日
    00
  • SpringBoot嵌入式Web容器原理与使用介绍

    SpringBoot嵌入式Web容器原理与使用介绍 什么是SpringBoot嵌入式Web容器 SpringBoot是基于Spring框架的一个快速开发框架,它内置了多种Web容器,可以很方便地选择使用嵌入式Web容器,而不需要依赖外置的Web容器。SpringBoot嵌入式Web容器是指将Web容器嵌入到应用程序中,将应用程序打成可执行的jar或war包后…

    Java 2023年5月20日
    00
  • jquery.pager.js实现分页效果

    实现分页效果是网站和应用中常见的功能,jQuery是一种广泛使用的JavaScript库,可以方便地实现分页效果。本文将介绍使用jQuery的一个分页插件jquery.pager.js来实现分页效果的完整攻略,包括具体的步骤和代码示例。 1. 引入jQuery和jquery.pager.js文件 在使用jquery.pager.js插件前需要引入jQuery…

    Java 2023年6月15日
    00
  • Java中HashMap与String字符串互转的问题解决

    Java中HashMap与String字符串互转的问题解决 在Java开发中,我们经常会使用到HashMap来做键值对的操作。有时候我们需要把HashMap转换成字符串,或者把字符串转换成HashMap。那么,如何进行这样的操作呢?下面是两种方式来解决问题。 使用Java中自带的方法进行转换 Java中提供了很多可以直接转换的方法,我们可以使用这些方法来进行…

    Java 2023年5月27日
    00
  • 详解Spring Boot实现日志记录 SLF4J

    详解Spring Boot实现日志记录 SLF4J 什么是SLF4J SLF4J是Simple Logging Facade for Java的缩写,它是一个Java基础框架,为各种不同的Java日志库提供了一个简洁的接口。 Spring Boot中如何使用SLF4J 在Spring Boot中,我们可以使用以下步骤引入SLF4J: 在pom.xml文件中添…

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