锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. WebSocket在Java Spring Boot+Vue框架中实现消息推送功能

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

0
  • JAVA
  • 发布于 2024-08-16
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

在现代 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>
2. 配置 WebSocket

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

@Configuration  
@EnableWebSocket  
public class WebSocketConfig implements WebSocketConfigurer {  
  
    @Override  
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {  
        registry.addHandler(new MyWebSocketHandler(), "/ws").setAllowedOrigins("*");  
    }  
}
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));  
        }  
    }  
}
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");  
        }  
    }  
}
三、前端实现
1. 安装 Vue Native WebSocket

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

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

在 Vue 项目的入口文件(如main.js)中引入并配置 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>
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>

注意:

  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 实例销毁时自动清理它们。但是,如果你以非标准方式添加了事件监听器,你可能需要手动清理它们以避免内存泄漏。

推荐好文:数据系统可视化大屏与数字看板:赋能智慧未来的多面手_实时数字看板 - CSDN 博客

标签: #软件开发 1171 #JAVA 991
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.