WebSocket在Java Spring Boot+Vue框架中实现消息推送功能

简介: 在现代Web应用中,实时消息提醒是一项非常重要的功能,能够极大地提升用户体验。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为实现实时消息提醒提供了高效且低延迟的解决方案。本文将详细介绍如何在Java Spring Boot后端和Vue前端框架中利用WebSocket实现消息提醒功能。

 在现代Web应用中,实时消息提醒是一项非常重要的功能,能够极大地提升用户体验。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为实现实时消息提醒提供了高效且低延迟的解决方案。本文将详细介绍如何在Java Spring Boot后端和Vue前端框架中利用WebSocket实现消息提醒功能。

一、技术栈

  • 后端:Java Spring Boot
  • 前端:Vue.js
  • WebSocket库:Spring Boot的WebSocket支持,Vue Native WebSocket库

二、后端实现

1. 添加依赖

首先,在Spring Boot项目的pom.xml中添加WebSocket的依赖:

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

image.gif

2. 配置WebSocket

创建一个配置类来启用WebSocket并注册WebSocket处理器:

@Configuration  
@EnableWebSocket  
public class WebSocketConfig implements WebSocketConfigurer {  
  
    @Override  
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {  
        registry.addHandler(new MyWebSocketHandler(), "/ws").setAllowedOrigins("*");  
    }  
}

image.gif

3. 实现WebSocket处理器

创建一个WebSocket处理器来处理连接、消息、错误和关闭事件:

@Component  
public class MyWebSocketHandler extends TextWebSocketHandler {  
  
    private static final ConcurrentHashMap<String, WebSocketSession> sessions = new ConcurrentHashMap<>();  
  
    @Override  
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {  
        sessions.put(session.getId(), session);  
        System.out.println("WebSocket session established: " + session.getId());  
    }  
  
    @Override  
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {  
        // 处理接收到的消息  
        System.out.println("Received message: " + message.getPayload());  
    }  
  
    @Override  
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {  
        sessions.remove(session.getId());  
        System.out.println("WebSocket session closed: " + session.getId());  
    }  
  
    // 发送消息到指定客户端  
    public void sendMessageToUser(String sessionId, String message) throws IOException {  
        WebSocketSession session = sessions.get(sessionId);  
        if (session != null && session.isOpen()) {  
            session.sendMessage(new TextMessage(message));  
        }  
    }  
}

image.gif

4. 控制器处理消息推送

创建一个控制器来触发消息推送:

@RestController  
@RequestMapping("/api/message")  
public class MessageController {  
  
    @Autowired  
    private MyWebSocketHandler webSocketHandler;  
  
    @PostMapping("/push")  
    public ResponseEntity<?> pushMessage(@RequestParam String sessionId, @RequestParam String message) {  
        try {  
            webSocketHandler.sendMessageToUser(sessionId, message);  
            return ResponseEntity.ok("Message sent successfully");  
        } catch (IOException e) {  
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Failed to send message");  
        }  
    }  
}

image.gif

三、前端实现

1. 安装Vue Native WebSocket

在Vue项目中安装Vue Native WebSocket库:

npm install vue-native-websocket

image.gif

2. 引入并使用WebSocket

在Vue项目的入口文件(如main.js)中引入并配置WebSocket:

import VueNativeSock from 'vue-native-websocket'  
  
Vue.use(VueNativeSock, 'ws://localhost:8080/ws', {  
    reconnection: true,  
    format: 'json',  
    connectManually: true  
});  
  
new Vue({  
    // Vue实例配置  
});

image.gif

3. 组件中使用WebSocket

在Vue组件中,使用WebSocket来接收消息:

<template>  
  <div>  
    <h1>Messages</h1>  
    <ul>  
      <li v-for="(message, index) in messages" :key="index">{{ message }}</li>  
    </ul>  
  </div>  
</template>  
  
<script>  
export default {  
  data() {  
    return {  
      messages: [] // 用于存储接收到的消息  
    };  
  },  
  mounted() {  
    // 如果需要手动连接WebSocket,可以在这里调用  
    // this.$connect();  
  
    // 监听WebSocket的message事件  
    this.$options.sockets.onmessage = (event) => {  
      // 假设服务器发送的是纯文本消息  
      const message = event.data;  
      // 将新消息添加到messages数组中  
      this.messages.push(message);  
  
      // 如果需要滚动到最新的消息,可以添加如下代码  
      // 注意:这取决于你的页面布局和CSS  
      // this.$nextTick(() => {  
      //   const messagesList = this.$el.querySelector('ul');  
      //   if (messagesList) {  
      //     messagesList.scrollTop = messagesList.scrollHeight;  
      //   }  
      // });  
    };  
  
    // 如果WebSocket是自动连接的,上面的$connect()调用可能是不必要的。  
    // 但是,如果你需要在组件挂载时做一些额外的设置或检查,你可以在这里进行。  
  },  
  beforeDestroy() {  
    // 组件销毁前断开WebSocket连接(如果之前手动连接了的话)  
    // 注意:如果WebSocket是自动管理的(如vue-native-websocket插件),  
    // 这可能不是必需的,因为插件通常会在Vue实例销毁时自动处理。  
    // 但为了完整性,这里还是展示一下如何手动断开连接  
    // this.$disconnect();  
  
    // 移除事件监听器(可选,取决于你是否需要在组件销毁时清理)  
    // this.$options.sockets.offmessage = null;  
    // 注意:vue-native-websocket插件并没有直接提供offmessage这样的方法,  
    // 这里只是为了说明如果需要手动清理事件监听器的概念。  
    // 实际上,你可以通过保存对监听器函数的引用并在需要时调用removeEventListener来实现。  
  }  
};  
</script>  
  
<style scoped>  
/* 你的样式 */  
</style>

image.gif

注意

  1. 在这个例子中,我们假设服务器发送的是纯文本消息,所以直接将event.data添加到messages数组中。如果你的服务器发送的是JSON对象,你需要先解析它(例如,使用JSON.parse(event.data))。
  2. this.$options.sockets.onmessage是一个简化的表示,用于说明如何监听WebSocket消息。然而,vue-native-websocket插件实际上提供了不同的方式来监听消息,通常是通过Vue的sockets选项或在Vue实例上直接监听$socket事件(取决于插件的版本和配置)。因此,请根据你实际使用的插件版本和配置来调整代码。
  3. beforeDestroy生命周期钩子中,我们注释掉了断开WebSocket连接的代码,因为vue-native-websocket插件通常会在Vue实例销毁时自动处理WebSocket连接的关闭。但是,如果你需要手动控制连接的开启和关闭,你可以取消注释相关代码。
  4. 同样地,我们也注释掉了移除事件监听器的代码,因为vue-native-websocket插件会管理这些监听器,并在Vue实例销毁时自动清理它们。但是,如果你以非标准方式添加了事件监听器,你可能需要手动清理它们以避免内存泄漏。
相关文章
|
24天前
|
XML 安全 Java
|
28天前
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
44 0
|
3天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
13天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
77 13
|
10天前
|
IDE Java 测试技术
互联网应用主流框架整合之Spring Boot开发
通过本文的介绍,我们详细探讨了Spring Boot开发的核心概念和实践方法,包括项目结构、数据访问层、服务层、控制层、配置管理、单元测试以及部署与运行。Spring Boot通过简化配置和强大的生态系统,使得互联网应用的开发更加高效和可靠。希望本文能够帮助开发者快速掌握Spring Boot,并在实际项目中灵活应用。
28 5
|
24天前
|
XML Java 数据格式
Spring Core核心类库的功能与应用实践分析
【12月更文挑战第1天】大家好,今天我们来聊聊Spring Core这个强大的核心类库。Spring Core作为Spring框架的基础,提供了控制反转(IOC)和依赖注入(DI)等核心功能,以及企业级功能,如JNDI和定时任务等。通过本文,我们将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring Core,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
52 14
|
21天前
|
缓存 Java 数据库连接
Spring框架中的事件机制:深入理解与实践
Spring框架是一个广泛使用的Java企业级应用框架,提供了依赖注入、面向切面编程(AOP)、事务管理、Web应用程序开发等一系列功能。在Spring框架中,事件机制是一种重要的通信方式,它允许不同组件之间进行松耦合的通信,提高了应用程序的可维护性和可扩展性。本文将深入探讨Spring框架中的事件机制,包括不同类型的事件、底层原理、应用实践以及优缺点。
49 8
|
21天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
54 6
|
1月前
|
Java 数据库连接 数据库
不可不知道的Spring 框架七大模块
Spring框架是一个全面的Java企业级应用开发框架,其核心容器模块为其他模块提供基础支持,包括Beans、Core、Context和SpEL四大子模块;数据访问及集成模块支持数据库操作,涵盖JDBC、ORM、OXM、JMS和Transactions;Web模块则专注于Web应用,提供Servlet、WebSocket等功能;此外,还包括AOP、Aspects、Instrumentation、Messaging和Test等辅助模块,共同构建强大的企业级应用解决方案。
75 2