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

yizhihongxing

以下是详细的攻略。

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日

相关文章

  • HashMap和HashTable底层原理以及常见面试题

    HashMap和HashTable底层原理以及常见面试题 1. HashMap和HashTable的区别 HashMap和HashTable都是Java中的重要容器类,它们的目的是为了存放和访问键值对。虽然它们的功能是相似的,但是它们在底层的实现和使用上有很大的不同。 1.1 HashMap HashMap的底层是基于哈希表实现的,其键值对存储在Entry数…

    Java 2023年5月26日
    00
  • servlet实现文件上传、预览、下载、删除功能

    准备工作 首先,在编写servlet实现文件上传、预览、下载、删除功能之前,需要先进行准备工作,包括: 建立一个Web项目 引入相关的jar包,如commons-fileupload.jar、commons-io.jar等 编写一个用于上传文档的html页面 定义文件上传后保存的路径 上传文件 上传文件是整个功能的核心部分,下面是实现文件上传的步骤: 2.1…

    Java 2023年6月15日
    00
  • Spring Boot如何使用Spring Security进行安全控制

    关于“Spring Boot如何使用Spring Security进行安全控制”的攻略,我们需要先明确以下几点: Spring Boot集成了Spring Security,只需要在pom.xml中引入Spring Security的依赖即可。 Spring Security可以配置多种安全验证方式,比如基于表单的验证、HTTP基本身份验证、OAuth2等。…

    Java 2023年5月20日
    00
  • 自己动手写的mybatis分页插件(极其简单好用)

    下面是自己动手写的mybatis分页插件的完整攻略。 1. 目标 我们的目标是自己手写mybatis分页插件,以便在查询大数据量时能够更加高效地进行分页操作。 2. 环境准备 本教程的示例环境如下: 操作系统:Windows 10 开发工具:IntelliJ IDEA JDK版本:1.8 mybatis版本:3.4.6 3. 新建项目 首先,我们需要新建一个…

    Java 2023年5月19日
    00
  • Java中的base64编码器

    下面是关于Java中的base64编码器的完整攻略。 简介 Base64编码是一种将二进制数据用文本形式表示的编码方式,常用于在传输过程中处理二进制数据或将二进制数据存储在文本文件中。在Java中,提供了Base64编码器和解码器,可以通过Java API方便地实现Base64编解码的功能。 使用Base64编码器 Java中提供了两种方式来实现Base64…

    Java 2023年5月20日
    00
  • Java最全文件操作实例汇总

    Java最全文件操作实例汇总 1. 文件的创建和写入 文件的创建与写入是文件操作的基础之一。使用Java可以很方便地完成这个过程。 import java.io.File; import java.io.FileWriter; import java.io.IOException; public class FileHandler { public stat…

    Java 2023年5月20日
    00
  • python实现数独算法实例

    python实现数独算法实例 介绍 数独是一种流行的逻辑游戏,也是计算机科学中常见的算法和数据结构问题。本文将介绍基于python实现数独算法的完整攻略。 算法原理 数独算法的原理可以归纳为两部分: 约束传播(Constraint Propagation)——基于已知的数推断未知的数; 回溯(Backtracking)——在没有更多的约束传播时,回溯到之前的…

    Java 2023年5月30日
    00
  • Java 对象在 JVM 中的内存布局超详细解说

    来看一下Java对象在JVM中的内存布局超详细解说的完整攻略。 概述 在Java中,对象是通过new关键字来创建的。当创建对象时,JVM会在堆(heap)中分配一块连续的内存空间,用来存储该对象的实例变量。这个连续的内存空间被称为Java对象的实例数据。 Java对象在JVM中的内存布局主要可以分为以下三个部分: 对象头(Object Header):对象头…

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