我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么使用Spring Boot+Vue实现Socket通知推送

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么使用Spring Boot+Vue实现Socket通知推送

本篇内容主要讲解“怎么使用Spring Boot+Vue实现Socket通知推送”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Spring Boot+Vue实现Socket通知推送”吧!

Spring Boot端

第一步,引入依赖

首先我们需要引入WebSocket所需的依赖,以及处理输出格式的依赖

<!--格式转换--><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency>   <groupId>com.alibaba</groupId>   <artifactId>fastjson</artifactId>   <version>1.2.73</version></dependency><!--WebSocket依赖--><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-websocket</artifactId></dependency>

第二步,创建WebSocket配置类

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configurationpublic class WebSocketConfig {    @Bean    public ServerEndpointExporter serverEndpointExporter() {        return new ServerEndpointExporter();    } }

第三步,创建WebSocket服务

这一步我们通过userId作为标识符,区分系统中对应的用户,后续也可基于此,进行其他的操作步骤。

import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.alibaba.excel.util.StringUtils;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component; import javax.websocket.*;import javax.websocket.server.PathParam;import javax.websocket.server.ServerEndpoint;import java.io.IOException;import java.util.HashMap;import java.util.Iterator;import java.util.concurrent.ConcurrentHashMap;  @ServerEndpoint("/websocket/{userId}")@Slf4j@Componentpublic class WebSocketServer {        private static int onlineCount = 0;        private static ConcurrentHashMap<String, WebSocketServer> webSocketMap = new ConcurrentHashMap<>();        private Session session;        private String userId = "";         @OnOpen    public void onOpen(Session session, @PathParam("userId") String userId) {        this.session = session;        this.userId = userId;        if (webSocketMap.containsKey(userId)) {            webSocketMap.remove(userId);            //加入set中        } else {            webSocketMap.put(userId, this);            //加入set中            addOnlineCount();            //在线数加1        }         log.info("用户连接:" + userId + ",当前在线人数为:" + getOnlineCount());         try {            HashMap<Object, Object> map = new HashMap<>();            map.put("key", "连接成功");            sendMessage(JSON.toJSONString(map));        } catch (IOException e) {            log.error("用户:" + userId + ",网络异常!!!!!!");        }    }          @OnClose    public void onClose() {        if (webSocketMap.containsKey(userId)) {            webSocketMap.remove(userId);            //从set中删除            subOnlineCount();        }        log.info("用户退出:" + userId + ",当前在线人数为:" + getOnlineCount());    }         @OnMessage    public void onMessage(String message, Session session) {        log.info("用户消息:" + userId + ",报文:" + message);        //可以群发消息        //消息保存到数据库、redis        if (StringUtils.isNotBlank(message)) {            try {                //解析发送的报文                JSONObject jsonObject = JSONObject.parseObject(message);                //追加发送人(防止串改)                jsonObject.put("fromUserId", this.userId);                String fromUserId = jsonObject.getString("fromUserId");                //传送给对应toUserId用户的websocket                if (StringUtils.isNotBlank(fromUserId) && webSocketMap.containsKey(fromUserId)) {                    webSocketMap.get(fromUserId).sendMessage(jsonObject.toJSONString());                    //自定义-业务处理 //                    DeviceLocalThread.paramData.put(jsonObject.getString("group"),jsonObject.toJSONString());                } else {                    log.error("请求的userId:" + fromUserId + "不在该服务器上");                    //否则不在这个服务器上,发送到mysql或者redis                }            } catch (Exception e) {                e.printStackTrace();            }        }    }         @OnError    public void onError(Session session, Throwable error) {        log.error("用户错误:" + this.userId + ",原因:" + error.getMessage());        error.printStackTrace();    }         public void sendMessage(String message) throws IOException {        //加入线程锁        synchronized (session) {            try {                //同步发送信息                this.session.getBasicRemote().sendText(message);            } catch (IOException e) {                log.error("服务器推送失败:" + e.getMessage());            }        }    }              public static void sendInfo(String message, String toUserId) throws IOException {        //如果userId为空,向所有群体发送        if (StringUtils.isEmpty(toUserId)) {            //向所有用户发送信息            Iterator<String> itera = webSocketMap.keySet().iterator();            while (itera.hasNext()) {                String keys = itera.next();                WebSocketServer item = webSocketMap.get(keys);                item.sendMessage(message);            }        }        //如果不为空,则发送指定用户信息        else if (webSocketMap.containsKey(toUserId)) {            WebSocketServer item = webSocketMap.get(toUserId);            item.sendMessage(message);        } else {            log.error("请求的userId:" + toUserId + "不在该服务器上");        }    }     public static synchronized int getOnlineCount() {        return onlineCount;    }     public static synchronized void addOnlineCount() {        WebSocketServer.onlineCount++;    }     public static synchronized void subOnlineCount() {        WebSocketServer.onlineCount--;    }     public static synchronized ConcurrentHashMap<String, WebSocketServer> getWebSocketMap() {        return WebSocketServer.webSocketMap;    } }

第四步,创建Controller进行发送测试

获取当前在线人数

import com.......WebSocketServer; @ApiOperation(value = "获取当前在线人数")@GetMapping("/getOnlineCount")public Integer getOnlineCount() {    return WebSocketServer.getOnlineCount();}

通过接口,向前端用户推送消息

import com.......WebSocketServer;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController; import java.io.IOException; @RestController@RequestMapping("/news")public class NewsController {    @GetMapping("/send")    public String send() {        try {            WebSocketServer.sendInfo("这是websocket发送过来的消息!", "需要推送的用户的编号");        } catch (IOException e) {            throw new RuntimeException(e);        }        return "发送消息成功";    } }

Vue端

第一步,创建连接工具类

创建工具类websocket.js,这里的userId就是用来作为标识符的userId

export class WebSocketClient {  constructor(userId) {    this.userId = userId;    this.websocket = null;    this.timeout = 10000; // 心跳超时时间,单位ms    this.timeoutObj = null; // 心跳定时器    this.serverTimeoutObj = null; // 服务器超时定时器    this.lockReconnect = false; // 避免重复连接    this.timeoutnum = null; // 重连延迟定时器  }   // 初始化WebSocket连接  initWebSocket() {    let wsUrl = `ws://127.0.0.1:8080/websocket/${this.userId}`;    this.websocket = new WebSocket(wsUrl);    this.websocket.onopen = this.websocketonopen.bind(this);    this.websocket.onerror = this.websocketonerror.bind(this);    this.websocket.onmessage = this.setOnmessageMessage.bind(this);    this.websocket.onclose = this.websocketclose.bind(this);    // 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。    window.onbeforeunload = this.websocketclose.bind(this);  }   // 启动心跳  start() {    console.log('start');    // 清除延时器    this.timeoutObj && clearTimeout(this.timeoutObj);    this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);      }   // 重置心跳  reset() {    // 清除时间    clearTimeout(this.timeoutObj);    clearTimeout(this.serverTimeoutObj);    // 重启心跳    this.start();  }   // 重新连接  reconnect() {    if (this.lockReconnect) return;    this.lockReconnect = true;    // 没连接上会一直重连,设置延迟避免请求过多    this.timeoutnum && clearTimeout(this.timeoutnum);    this.timeoutnum = setTimeout(() => {      this.initWebSocket();      this.lockReconnect = false;    }, 5000)  }   // 处理收到的消息  async setOnmessageMessage(event) {    console.log(event.data, '获得消息');    // 重置心跳    // this.reset();    // 自定义全局监听事件    window.dispatchEvent(new CustomEvent('onmessageWS', {      detail: {        data: event.data      }    }))    // //发现消息进入    开始处理前端触发逻辑    // if (event.data === 'success' || event.data === 'heartBath') return  }   // WebSocket连接成功回调  websocketonopen() {    // 开启心跳    this.start();    console.log("WebSocket连接成功!!!" + new Date() + "----" + this.websocket.readyState);    clearInterval(this.otimer);//停止  }   // WebSocket连接错误回调  websocketonerror(e) {    console.log("WebSocket连接发生错误" + e);  }   // WebSocket连接关闭回调  websocketclose(e) {    this.websocket.close();    clearTimeout(this.timeoutObj);    clearTimeout(this.serverTimeoutObj);    console.log("websocketcloe关闭连接")  }   // 关闭WebSocket连接  closeWebSocket() {    this.websocket.close();    console.log("closeWebSocket关闭连接")  }   // 监听窗口关闭事件  onbeforeunload() {    this.closeWebSocket();  }}

第二步,建立连接

在任意你想建立连接的页面中建立Socket连接

比如,在用户点击登录按钮之后

在这里可以使用原型,创建连接对象,并启动连接

<script>import Vue from "vue";import {WebSocketClient} from "@/utils/websocket";............methods:{  handleLogin() {      this.$refs.loginForm.validate(valid => {        if (valid) {          this.loading = true          this.$store.dispatch('user/login', this.loginForm).then(() => {            this.$router.push({path: this.redirect || '/'})            this.loading = false                        Vue.prototype.$WebSocketClientInstance = new WebSocketClient('t');            Vue.prototype.$WebSocketClientInstance.initWebSocket()                      }).catch(() => {            this.loading = false          })        } else {          this.$message({message: '请填写正确格式的用户名或密码', type: 'error'})          return false        }      })    }    } ..........</script>

怎么使用Spring Boot+Vue实现Socket通知推送

第三步,监听服务器发送过来的消息

在你想监听的页面,使用监听器进行监听

<script>........mounted() {    // 添加socket通知监听    window.addEventListener('onmessageWS', this.getSocketData)},methods: {    // 收到消息处理    getSocketData(res) {      console.log(res.detail)      console.log("llll")    },} ........</script>

这个时候,你就可以通过后端的接口进行发送了

 搞个测试

怎么使用Spring Boot+Vue实现Socket通知推送

怎么使用Spring Boot+Vue实现Socket通知推送

第四步,关闭连接 

搞个按钮

<template>  <div>    <button @click="closeConnect">关闭连接</button>  </div></template> <script>import {WebSocketClient} from "@/utils/websocket";import Vue from "vue"; export default {  methods: {    closeConnect() {      console.dir(Vue.prototype)      Vue.prototype.$WebSocketClientInstance.closeWebSocket();    },  }}</script>

怎么使用Spring Boot+Vue实现Socket通知推送

到此,相信大家对“怎么使用Spring Boot+Vue实现Socket通知推送”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么使用Spring Boot+Vue实现Socket通知推送

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么使用Spring Boot+Vue实现Socket通知推送

本篇内容主要讲解“怎么使用Spring Boot+Vue实现Socket通知推送”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Spring Boot+Vue实现Socket通知推送”吧!
2023-07-05

Spring Boot+Vue实现Socket通知推送的完整步骤

最近工作中涉及消息通知功能的开发,所以下面这篇文章主要给大家介绍了关于Spring Boot+Vue实现Socket通知推送的完整步骤,文中通过实例代码以及图文介绍的非常详细,需要的朋友可以参考下
2023-05-14

Android中使用socket通信实现消息推送的方法详解

原理 最近用socket写了一个消息推送的demo,在这里和大家分享一下。 主要实现了:一台手机向另外一台手机发送消息,这两台手机可以随时自由发送文本消息进行通信,类似我们常用的QQ。 效果图:原理:手机通过socket发送消息到服务器,服
2022-06-06

怎么利用spring boot+WebSocket实现后台主动消息推送功能

这篇文章主要讲解了“怎么利用spring boot+WebSocket实现后台主动消息推送功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么利用spring boot+WebSocket
2023-06-30

Spring Boot怎么实现通用Auth认证

这篇文章主要介绍“Spring Boot怎么实现通用Auth认证”,在日常操作中,相信很多人在Spring Boot怎么实现通用Auth认证问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring Boot
2023-06-29

php怎么使用socket简单实现通信功能

这篇文章主要讲解了“php怎么使用socket简单实现通信功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php怎么使用socket简单实现通信功能”吧!WebSocket的作用WebSo
2023-07-05

怎么使用SAP云平台的Notification服务给Android应用推送通知消息

今天就跟大家聊聊有关怎么使用SAP云平台的Notification服务给Android应用推送通知消息,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。登录SAP Cloud Platf
2023-06-03

在Kotlin中使用Spring Boot怎么实现一个RESTful服务

今天就跟大家聊聊有关在Kotlin中使用Spring Boot怎么实现一个RESTful服务,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Spring太复杂了,配置这个东西简直就是浪
2023-05-31

怎么在Spring Boot中使用ElasticSearch实现一个搜索引擎

这篇文章将为大家详细讲解有关怎么在Spring Boot中使用ElasticSearch实现一个搜索引擎,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Elastic Search是一个开源的
2023-05-30

怎么使用C++ Thread实现简单的socket多线程通信

本篇内容介绍了“怎么使用C++ Thread实现简单的socket多线程通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!服务端多线程功能放
2023-07-02

怎么在SpringBoot2.0中使用MQTT实现一个消息推送功能

今天就跟大家聊聊有关怎么在SpringBoot2.0中使用MQTT实现一个消息推送功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。springboot是什么springboot一种
2023-06-14

怎么使用Java socket通信模拟QQ实现多人聊天室

这篇文章主要介绍“怎么使用Java socket通信模拟QQ实现多人聊天室”,在日常操作中,相信很多人在怎么使用Java socket通信模拟QQ实现多人聊天室问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎
2023-07-02

spring boot 中的hibernate怎么使用ehcache 2.x实现二级缓存

今天就跟大家聊聊有关spring boot 中的hibernate怎么使用ehcache 2.x实现二级缓存,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。项目依赖
2023-05-31

使用Spring Boot怎么样实现一个验证码生成功能

这篇文章给大家介绍使用Spring Boot怎么样实现一个验证码生成功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、验证码生成类import java.awt.*;import java.awt.image.Bu
2023-05-31

Vue怎么使用postMessage实现父子跨域通信

这篇文章主要讲解了“Vue怎么使用postMessage实现父子跨域通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue怎么使用postMessage实现父子跨域通信”吧!一、跨域通信1
2023-07-04

怎么在Spring Boot与Thymeleaf中使用JPA实现一个分页效果

怎么在Spring Boot与Thymeleaf中使用JPA实现一个分页效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1 创建项目,用pom.xml引入依赖这里将创建名为T
2023-06-06

怎么使用Python实现企业微信通知功能

本篇内容主要讲解“怎么使用Python实现企业微信通知功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Python实现企业微信通知功能”吧!前言常见的通知方式有:邮件,电话,短信,微信
2023-06-30

在Spring Boot中使用/info端点怎么实现输出Git的版本信息

今天就跟大家聊聊有关在Spring Boot中使用/info端点怎么实现输出Git的版本信息,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。POM配置首先,我们可以挑选任意一个Spri
2023-05-31

vue下怎么使用mqtt服务端实现即时通讯

这篇文章主要介绍“vue下怎么使用mqtt服务端实现即时通讯”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue下怎么使用mqtt服务端实现即时通讯”文章能帮助大家解决问题。MQTT协议MQTT(M
2023-07-04

SpringBoot中怎么使用异步线程池实现生产环境批量数据推送

今天小编给大家分享一下SpringBoot中怎么使用异步线程池实现生产环境批量数据推送的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录