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利用Ant脚本生成war包全过程

    生成war包是Java Web开发中的重要过程之一。为了优化这个过程,可以使用Ant脚本来自动化这个过程。以下是Java利用Ant脚本生成war包的详细攻略。 1. 创建Ant脚本 首先需要创建一个Ant脚本,脚本需要包含以下几个步骤: 清空目标目录,以准备生成新的war包。 将源代码和依赖库编译成Java字节码。 将字节码打包成war包。 以下是示例Ant…

    Java 2023年5月26日
    00
  • java常用Lambda表达式使用场景源码示例

    Java常用Lambda表达式使用场景源码示例 什么是Lambda表达式? Lambda表达式是Java 8引入的新特性之一,它是一个匿名函数,可以传递到函数式接口中使用。Lambda表达式提供了一个简单而强大的语法来处理集合数据,比传统的循环语句更加简洁易懂。 Lambda表达式的语法格式为:(parameters) -> expression 或 …

    Java 2023年5月26日
    00
  • Java 实现使用Comparable按照我们指定的规则排序

    下面是详细讲解“Java 实现使用 Comparable 按照我们指定的规则排序”的攻略: 一、使用 Comparable 接口 Comparable 接口是 Java 中的一个接口,它有一个 compareTo 方法,用于指定对象排序的规则。如果一个类实现了 Comparable 接口,就可以使用 Collections.sort 或 Arrays.sor…

    Java 2023年5月27日
    00
  • maven profile动态选择配置文件详解

    下面是本人为你准备的maven profile动态选择配置文件的攻略,希望能帮助到你。 什么是maven profile Maven Profile是Maven中的一个重要概念,它定义了一组配置的集合,用来指定开发、测试和生产环境下使用不同的配置。通过设置不同的Profile,可以实现在不同环境下对应用程序的多个设置的更改。 Maven Profile的配置…

    Java 2023年6月2日
    00
  • Java中的抽象类是什么?

    抽象类是在Java中用于定义接口的半实现的类。它必须被继承才能被使用,并要求子类实现其抽象方法。在Java中,我们使用 abstract 关键字来声明抽象类。 抽象类本身不能被实例化,需要通过子类来实现。抽象类中可以包含非抽象的方法,这些方法跟普通的类方法一样,同样需要实现。 接下来我们通过两个例子来详细讲解Java中的抽象类。 示例一:定义抽象类 publ…

    Java 2023年4月27日
    00
  • java加密算法–MD5加密和哈希散列带秘钥加密算法源码

    下面我来详细讲解Java加密算法——MD5加密和哈希散列带秘钥加密算法源码的完整攻略。 MD5加密算法 概述 MD5(Message Digest Algorithm)是一种单向的哈希算法,可以将任意长度的数据加密成一个128位的二进制串。MD5算法将数据经过多次非线性函数变换和数据干扰后,生成一个唯一的128位散列码,具有很高的安全性,被广泛应用于数据的完…

    Java 2023年5月19日
    00
  • java HttpClient传输json格式的参数实例讲解

    Java HttpClient传输JSON格式参数实例讲解 1. 什么是HttpClient HttpClient是一个HTTP客户端工具包,Apache HttpClient的封装版本是阿希替(AxTire)HTTP Client。 HttpClient我们可以用它来模拟浏览器的请求,实现登录、提交表单、发送请求等功能,适用于各种简单和复杂的操作。 2. …

    Java 2023年5月26日
    00
  • 用SpringBoot框架来接收multipart/form-data文件方式

    讲解如下: 准备工作 首先,我们需要创建一个Spring Boot项目,可以使用选择依赖的方式选择web、lombok和devtools三个依赖,如下所示: <!– Spring Web 依赖 –> <dependency> <groupId>org.springframework.boot</groupId&g…

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