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日

相关文章

  • Java Runtime类详解_动力节点Java学院整理

    这里是针对“Java Runtime类详解_动力节点Java学院整理”的完整攻略。 什么是Java Runtime类? Java Runtime类是Java程序运行环境的一部分。它提供了许多重要的运行时方法,例如在程序运行时执行其他程序、获取JVM的空闲内存量、强制垃圾回收等。本身是一个单例类,通过获取 Runtime.getRuntime() 实例获得。 …

    Java 2023年5月20日
    00
  • Java花式解决’分割回文串 ii’问题详解

    对于Java花式解决’分割回文串 ii’问题详解,我将从以下几个方面进行讲解: 问题描述 解题思路 实现代码 示例说明 1. 问题描述 给定一个字符串s,将s分割成若干个非空回文子串,使得每个子串都是回文串。求最少需要分割几次。 2. 解题思路 本题可以使用动态规划来求解。定义dp[i]表示前缀s[0…i]最少需要切几次,才能满足每个子串都是回文串。那么…

    Java 2023年5月27日
    00
  • Java之Arrays的各种功能和用法总结

    Java之Arrays的各种功能和用法总结 简介 Java中的Arrays类提供了一组用于操作数组的静态方法。Arrays类中的方法支持对数组的排序、搜索、比较、填充和转换等操作,该类还提供了一个asList()方法来创建一个ArrayList. 方法列表 下面是Arrays类中一些常用方法的列表: 方法 描述 sort() 对数组进行排序。 binaryS…

    Java 2023年5月26日
    00
  • JavaWeb实现压缩多个文件并下载实例详解

    JavaWeb实现压缩多个文件并下载实例详解 在JavaWeb开发过程中,经常需要将多个文件压缩成一个文件并提供下载功能。本文将为大家分享使用Java实现多个文件压缩并提供下载的方法。 1. 准备工作 首先需要导入java.util.zip.ZipEntry和java.util.zip.ZipOutputStream 这两个类。 2. 实现压缩多个文件 使用…

    Java 2023年5月19日
    00
  • 简单了解mybatis拦截器实现原理及实例

    下面是“简单了解MyBatis拦截器实现原理及实例”的完整攻略。 什么是MyBatis拦截器 MyBatis提供了一种灵活的机制,允许插件来干扰和改变SQL的执行过程。这种机制基于MyBatis的拦截器接口,可以拦截MyBatis框架中的各种操作,如StatementHandler、ResultSetHandler、Executor、ParameterHan…

    Java 2023年5月19日
    00
  • Spring扩展BeanFactoryPostProcessor使用技巧详解

    首先需要明确的是,BeanFactoryPostProcessor是在Spring容器实例化Bean之后,在Bean实例化之前处理BeanFactory中的BeanDefinition的接口。 一、BeanFactoryPostProcessor的使用场景 通常,在开发中,我们会利用BeanFactoryPostProcessor来修改或扩展BeanDefi…

    Java 2023年5月31日
    00
  • SSH 框架简介

    SSH框架简介 SSH框架是一种基于Java的web开发框架,它整合了Struts, Spring 和 Hibernate 三个优秀的开源框架,并提供了一系列的组件来支持Web应用的开发和部署。 SSH框架的三个组成部分 Struts Struts是一款广泛应用于Web应用开发中的MVC框架,它的目的是将业务逻辑、数据和展现层分离出来,提高应用程序的可拓展性…

    Java 2023年5月20日
    00
  • Java通过jersey实现客户端图片上传示例

    下面是实现“Java通过jersey实现客户端图片上传示例”的攻略。 准备工作 确保已经安装好Java开发环境和Maven。 在Maven中加入Jersey的依赖,例如: <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-serv…

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