vue项目中使用websocke即时通讯实现系统公告实时获取并提醒

news2024/11/26 13:51:42

一、使用场景
发布者设置需要发布的公告内容、公告接收用户和发布时间,到达发布时间时及时通知提醒已登录系统用户,使用websocke来实现前端与服务器保持长连接,以便实时过去公告信息。
在这里插入图片描述
在这里插入图片描述

  • WebSocket是一种在单个TCP连接上进行全双工通信的协议。这种协议使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。WebSocket基于TCP传输协议,并且复用HTTP的握手通道,即基于HTTP的"keep-alive"机制,允许在一次TCP连接中传送多个HTTP请求和响应。
  • WebSocket的通信过程大致如下:在建立WebSocket连接时,客户端会向服务器发送一个HTTP请求报文,其中包含升级协议的请求头。服务器在接收到该请求后会返回一个HTTP响应报文,其中包含升级协议的响应头。在收到服务器的响应后,客户端和服务器之间的连接就会升级为WebSocket连接,此时客户端和服务器之间的通信就不再需要使用HTTP协议的请求和响应报文,而是直接进行双向数据传输。
  • WebSocket协议的特点包括: 较少的控制开销:在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。
  • 更强的实时性:由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。
  • 保持连接状态:与HTTP不同的是,WebSocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。
  • 更好的二进制支持:WebSocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。
  • 可以支持扩展:WebSocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。
  • 与HTTP长连接相比,WebSocket连接在数据传输效率和实时性方面具有明显优势。HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP
    header,消息交换效率低。而WebSocket连接在建立后,可以直接进行双向数据传输,无需反复建立连接和发送HTTP请求,从而大大提高了数据传输效率和实时性。
  • 总之,WebSocket是一种高效、实时的全双工通信协议,适用于需要实时通信和数据传输的场景。

二、实现过程

  1. 封装自定义websocket服务
import config from "./config"

/** 自定义websocket服务 */
export default class SocketService {
    /**
     * 单例
     */
    static instance = null
    static get Instance() {
        if (!this.instance) {
            this.instance = new SocketService()
        }
        return this.instance
    }
    /** 和服务端连接的socket对象 */
    ws = null
    /** 服务器连接地址 */
    wsUrl = null
    /** 连接用户Id */
    userId = null
    /** 存储回调函数 */
    callBackMapping = {}
    /** 标识是否连接成功 */
    connected = false

    /** 重新连接间隔(ms) */
    connectRetryTime = 3000
    /** 重新连接次数 */
    connectRetryCount = 0

    /** 定义连接服务器的方法 */
    connect(_userId) {
        // 连接服务器
        if (!window.WebSocket) {
            return console.log('您的浏览器不支持WebSocket')
        }
        // // =============环境判断===============
        this.userId = _userId;
        if (process.env.NODE_ENV == 'development') {
            this.wsUrl = config.development_config.wsUrl + _userId + ':' + Date.now();
        }
        else if (process.env.NODE_ENV == 'debug') {
            this.wsUrl = config.development_config.wsUrl + _userId + ':' + Date.now();
        }
        else if (process.env.NODE_ENV == 'production') {
            this.wsUrl = config.production_config.wsUrl + _userId + ':' + Date.now();
        }
        this.ws = new WebSocket(this.wsUrl)
        // 连接成功的事件
        this.ws.onopen = () => {
            console.log('Socket连接服务端成功,您的连接地址:' + this.wsUrl);
            this.connected = true
            // 重置重新连接的次数
            this.connectRetryCount = 0
        }
        // 1.连接服务端失败
        // 2.当连接成功之后, 服务器关闭的情况
        this.ws.onclose = () => {
            console.log('连接服务端失败')
            this.connected = false
            this.connectRetryCount++
            if (this.connectRetryCount >= 10) {
                console.log('Socket出错,已断开连接');
            }else{
                console.log('Socket出错:第' + this.connectRetryCount + '次重新连接尝试!')
                this.connect(this.userId);
            }
        }

    }
}


  1. 在用户登录成功后建立连接,App.vue中也要建立连接(用户刷新后要重新连接)
    login.vue
    login.vue
    App.vue
    在这里插入图片描述
    main.js
    在这里插入图片描述

  2. 对应通知页面获取数据并以弹框的形式渲染

/** 即时通讯相关参数 */
  im: {
     ws: null,
     messageList: [],
     message: {},
       },
   watch: {
      'im.message': {
          handler(newVal, oldVal) {
             if (newVal != oldVal) {
               console.log('message=>', newVal);
               this.notVisible = true;
               setTimeout(() => {
                   this.notVisible = false;
                    }, 10000);

                }
            },
        }
    },
    created() {
        // 检测浏览器是否支持Websocket
        if (typeof WebSocket == 'undefined') {
            this.$alert('系统检测到您的浏览器不支持Websocket通信协议,这将会导致您无法正常进行课堂互动!建议您更换浏览器进行观看!', '警告', {
                confirmButtonText: '知道了',
                callback: () => { }
            });
        }
        else {
            this.im.ws = this.$socket.ws
            var retry = setInterval(() => {
                if (this.im.ws == null) {
                    this.im.ws = this.$socket.ws
                } else {
                    this.initIM();
                    clearInterval(retry)
                }
            }, 1000);

        }
    },
    /** 初始化即时通讯 */
        initIM() {
            var _this = this;
            // 接收消息
            // console.log(_this.im.ws);
            _this.im.ws.onmessage = function (event) {
                var message = JSON.parse(event.data);
                _this.im.message = message.data;
                // console.log(_this.im.message);
            }
            // 出现错误
            _this.im.ws.onerror = function (error) {
                _this.$message.error('即时通讯出现错误');
                console.log("即时通讯出现错误:", error);
            };
        },

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1659923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

17.Blender RC大佬EEVEE皮肤节点预设导入

如何添加节点预设 在底下的左下角打开Geometry Node Editor 选中正方体,点击新建 当鼠标指针在两个模块之间,是十字的样子时 可以拖出一个新的板块 然后打开文件浏览器 找到节点预设然后拖入到底下的节点编辑界面就可以了或者是blend文件&#xf…

微信小程序流量主如何自定义广告组件后台控制广告显示方式附源码[收藏]

最近开发了一个微信小程序,开通了流量主,引用广告显示。本教程干货满满,附上代码,建议**【收藏点赞】** 微信小程序广告有以下几种:Banner广告、激励广告、插屏广告、视频广告、视频贴片广告、封面广告。 为了增加广告…

pycharm如何对for循环中第n次循序执行断点

目录 在 PyCharm 中,您可以设置条件断点来实现这个功能,这样只有在满足特定条件时断点才会被触发。以下是设置仅在 for 循环的第 n 次迭代时触发断点的步骤: 设置断点: 首先,找到您想要在 for 循环中设置断点的行。点击…

找最大数字-第12届蓝桥杯国赛Python真题解析

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第60讲。 找最大数字&#…

【C++】C/C++中新const用法:const成员

欢迎来到CILMY23的博客 本篇主题为: C/C中新const用法:const成员 个人主页:CILMY23-CSDN博客 系列专栏:Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux 感谢观看,支持的可以给个一键三连,点赞…

如何设置海外虚拟IP的地址?

经济全球化发展,需要使用到海外ip的场景越来越多,比如跨境电商、海外投放、市场调研等等。海外虚拟ip地址已经成为了个人和企业不可或缺的工具。那么作为用户,该如何设置海外虚拟IP的地址? 设置海外IP的方式有以下几种&#xff1a…

栈结构(c语言)

1.栈的概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈&am…

Day2:调节屏幕驱动

Day2调节屏幕驱动 原理图: 要想调节屏幕驱动

泛微OA中,设置明细表某一列隐藏

泛微OA中,设置明细表的某一列字段进行隐藏 最近在接到的需求中,要求在主表中选择的平台类型为亚马逊的时候,在新增明细表数据时需要做到实时的提醒,例如:选择亚马逊时,所填的渠道不能为空 这个时候&#x…

word 毕业论文格式调整

添加页眉页脚 页眉 首先在页面上端页眉区域双击,即可出现“页眉和页脚”设置页面: 页眉左右两端对齐 如果想要页眉页脚左右两端对齐,可以选择添加三栏页眉,然后将中间那一栏删除,即可自动实现左右两端对齐&#x…

腾讯云ubuntu新建用户后,命令行只显示$

这是因为,新建用户命令行解释器默认是sh,需要手动切换为bash,bash可以认为是sh的加强版本。 所以我们只需要将,shell切换为bash就好了。 切换到root 修改配置文件 vim/etc/bash 将sh修改为bash

不走寻常路!酷开科技不断升级酷开系统满足消费者日益增长的需求

在科技日新月异的今天,人们对生活品质的要求越来越高。为此,酷开科技不断升级酷开系统,以满足消费者日益增长的需求。为了让消费者体验更好的服务,在酷开系统中设立了酷开会员,满足消费者的更多需求。丰富的特权和定制…

Highcharts 实现3D饼图 tooltip轮播

实现3D饼图,并且轮播显示tooltip 自定义toottip样式 import Highcharts from highcharts; import highcharts from highcharts; import highcharts3d from highcharts/highcharts-3d;highcharts3d(Highcharts); highcharts3d(highcharts); import { useEffect, use…

分享四种免费获取SSL的方式

SSL证书目前需要部署安装的网站很多,主要还是基于国内目前对证书的需求度在不断的升高,网站多了、服务器多了之后。网络安全问题就成为了大家不得不面对的一个重要的问题了。SSL证书的作用有很多,这里就不一一详述了,本期作品主要…

同一局域网内互传文件

1. 打开要共享的文件夹,然后在地址框内输入cmd 2. 弹出的命令框内输入python -m http.server (这么就创建好了共享服务器) 3.win R输入cmd运行 4.输入ipconfig找到IP地址 5.另一台同一局域网内的机子就可以在网页浏览器输入ip和端口号…

智能奶柜:健康生活新风尚

智能奶柜:健康生活新风尚 在快节奏的都市生活中,健康与便利成为了现代人的双重追求。而在这两者交汇之处,智能奶柜应运而生,它不仅是科技与生活的完美融合,更是日常营养补给的智慧之选。 清晨的第一缕温暖 —— 新鲜…

谷歌上架,白包号放着备用,啥也没干也被封?是什么情况?

众所周知,Google Play Store是全球最大的应用商店之一,每天都有大量的应用被上传和下架。 同时,随着谷歌上架行业的发展,谷歌现在的审核系统越来越智能和先进,开发者们尝试着各种方法来提高上架成功率。其中&#xff…

TCP及IP协议

TCP协议的传输是可靠的,而UDP协议的传输“尽力而为” TCP传输可靠性———确认,重传,排序,流控。 流控:滑动窗口机制 TTL--- 数据包每经过一个路由器的转发,他的TTL值将减1,当一个数据包中的T…

武汉星起航:五对一精细化服务助力合作伙伴开启亚马逊新篇章

武汉星起航电子商务有限公司以其专业的服务和独特的模式,为合作伙伴在亚马逊自营领域开拓了一片新天地。自2017年专注于亚马逊自营以来,武汉星起航不仅积累了丰富的经验,更在2020年成立了武汉星起航电子商务有限公司,进一步提升了…

文件夹名批量重命名:一键实现中文到意大利语的高效翻译!文件管理更高效!

文件夹管理成为了我们日常工作和生活中的重要一环。当文件夹名称繁杂且多样,尤其是涉及到不同语言时,如何快速、准确地批量重命名,成为了许多人的迫切需求。今天,我们就来聊聊如何轻松实现文件夹名从中文到意大利语的批量翻译&…