小程序跟服务器长连接,h5和小程序socket长连接和公共管理方案(vue+redux+websocket)...

2023-11-14

h5和小程序socket长连接和公共管理方案(vue+redux+websocket)

h5和小程序socket长连接和公共管理方案(vue+redux+websocket)

socket和公共状态管理连接方案(vuex,redux和小程序)websocket与公共管理逻辑图

websocket与vue及vuex案例

subscribe订阅器

emit触发器

heart心跳机制

小程序的socket连接 ,

我们都知道在vue和react这种单页面组件化项目中,建立socket连接会遇到,重复连接,切换组件连接中断等问题,而且如果想要在任何页面接受到来自socket传递的信息,所以在建立socket连接时候就要考虑是否要把连接实例化放在公共state里边统一管理,这样可以方便在任何组件中调用socket方法。这里会介绍socket与Vuex和redux进行连接实时接受信息改变数据的方案。

13dde6ecfcb73c4c35c5f1a152b2c2a3.png

本方案的大体思路就是如上图所示,现在页面初始化的时候根据需要向vuex或者redux发起dispatch触发初始化的方法,初始化的时候触发websocket,js构造函数或者类的实例,并且要把改变公共状态方法的commit作为参数传递给socket实例 , 而真正建立起socket连接的方法实在webosocket实例中进行的,websocket实例会暴露出两个方法,一个subscribe用来监听服务端传递的信息来改变管理状态,当然这里的触发是根据调用commit 函数来触发的,另一个是又任意组件调用的emit方法 ,来把信息传递给服务端,从而实现了双向通信,并把通信回执内容放在公共状态管理,避免切换组件信息丢失,重新连接,丢失连接等情况发生。下面会拿vuex例子具体讲一下流程

6784b772c4156e8297cfbad58ef82828.png

以上就是文件的格式(这里简化了), websocket.js就是socket方法集里边又订阅器,发布器,失败调度,心跳机制 , vuex下边的socket,js就是一个vuex 在redux中就是一个reducer,

socket.vue就是要用到socket连接的组件,废话不说,下面一一解释

首先我们来看socket初始化

if (!socket.ws) {

//在socket.vue文件中初始化socket连接

this.$store.dispatch('socketInit')

}

这是只是单独触发了一个dispatch 在调用了一个socketInit方法,然后我们来看vuex中socket.js中的socketInit方法

import Socket from '../websocket' //socket 方法类

import socketAction from '../../config/socket' //这个是对服务端的数据处理的中间件函数,这里可以忽略

export default {

state: {

ws: null, // websorket实例

},

mutations: {

subscribe_socket (state,{data}){

//这里的data为socket连接后端返回来的数据

},

contentSocket (state, { commit }) {

state.ws = new Socket(commit, socketAction)

}

},

actions: {

// 创建实例

socketInit ({commit, state}) {

commit('contentSocket', { commit }) //把commit作为参数

}

}

}

在vuex的异步函数actions调用了初始化的方法,然后把触发contentSocket 发法来创建实例,并绑定在state上的ws上,这里一定要把commit 来作为参数,一边socket实例能触发方法改变state,

我们知道了socket实例如何绑定和commit传递的了 ,下面我们看看websocket.js文件怎么运作的了

function socket (commit, actions) {

if (isType(commit) !== 'Function') {

throw new Error('commit must be a function')

}

this.commit = commit //触发vuex中mutations的commit

this.actions = actions || null

this.timer = null

this.errorResetNumber = 0 // 错误重连间隔

this.closeWs = false

this.errorFrom = 0 // socket断开来源

this.errorResetTimer = null // 错误重连轮询

this.errorDispatchOpen = true // 开启错误调度

this.heartSocketOpen = false

isSocketContent()

this.$soctket_init()

}

我们看到了websocket函数是一个构造函数用来做初始化操作, isSocketContent()是用来获取token等操作大家不必在意, 这里触发了一个soctketinit()方法,接下来我们看一下soctket_init()方法,接下来我们看一下soctketi?nit()方法,接下来我们看一下soctket_init()方法

socket.prototype.$soctket_init = function (callback) {

const _this = this

if (_this.closeWs) {

throw new Error('socket is closed ,$socker_init is fail , all methods is invalid')

}

const token = window.localStorage.getItem('token') || window.sessionStorage.getItem('token') || null

if (!token) {

throw new Error('token is underfined')

}

const handerErrorMachine = () => {

if (_this.errorResetNumber === 4) {

_this.errorResetNumber = 0

_this.errorResetTimer = null

_this.errorFrom = 0

_this.errorDispatchOpen = false

_this.ws = null

console.log('socket连接失败')

return

}

_this.errorResetTimer = setTimeout(() => {

_this.$soctket_init()

_this.errorResetNumber++

}, _this.errorResetNumber * 2000)

}

const errorDispatch = (eventment) => { //错误调度

let event = eventment

return function () {

if (_this.errorFrom === 0 && _this.errorDispatchOpen) {

_this.errorFrom = event

}

event === 1 ? console.log('web socket has failed from closeState ') : console.log('web socket has failed from errorState ')

if (_this.errorFrom === event && !_this.closeWs) {

_this.errorResetTimer && clearTimeout(_this.errorResetTimer)

handerErrorMachine()

}

}

}

if (this.timer) clearTimeout(this.timer)

_this.ws = new WebSocket(socketUrl + '?token=' + token) //这里才进行了真正的socket连接

_this.ws.onopen = function () {

callback && callback()

_this.errorResetNumber = 0

_this.errorResetTimer = null

_this.errorFrom = 0

_this.errorDispatchOpen = true

_this.$soctket_subscribe()

_this.$soctket_heartSoctket()

console.log('web socket has connected ')

}

_this.ws.onclose = errorDispatch(1)

_this.ws.onerror = errorDispatch(2)

}

这里才是真正的socket连接 和一些错误处理方式 , 这里把socket连接和构造函数中的ws绑定在一起,以及一个连接失败的调度机制 , 里边有一个之前一直提到的方法,.soctketsubscribe()没错就是它,监听后端传来信息的方法,类似于发布订阅模式的订阅者,值得提出的一点是.soctket_subscribe() 没错就是它,监听后端传来信息的方法,类似于发布订阅模式的订阅者,值得提出的一点是.soctkets?ubscribe()没错就是它,监听后端传来信息的方法,类似于发布订阅模式的订阅者,值得提出的一点是.soctket_heartSoctket() 是一个心脏搏动机制,我们知道如果socket连接长时间没有通话会自动断开连接,所以这里有一个心脏搏动机制。接下来我们看一下,soctket_subscribe 方法

/**

* 订阅器->接受广播

*/

socket.prototype.$soctket_subscribe = function () {

const _this = this

_this.ws.onmessage = function (res) {

if (_this.actions) {

if (isType(_this.actions) !== 'Function') {

throw new Error('actions')

} else {

_this.commit(..._this.actions(res.data))

}

} else {

_this.commit(res.data)

}

_this.$soctket_heartSoctket()

}

}

我们才看到原来之前vuex传进来的 commit 在这里发挥了作用,也就是触发mutations 来改变state里边 的数据 ,来重新渲染试图 ,接下来我们看一下emit触发器

/**

* 触发器->发布信息

* @param callback 状态处理

* @param value 数据处理

*/

socket.prototype.$soctket_emit = function (value, callback) {

const _this = this

const poll = function () {

return _this.ws.readyState

}

if (callback && isType(callback) !== 'Function') {

throw new Error('$socket_emit arugment[1] must be a function')

}

if (!_this.ws) {

throw new Error('$socket dispatch is fail please use $socket_open method')

}

if (_this.ws.readyState === 1) { // 连接成功状态

_this.ws.send(value)

_this.$soctket_heartSoctket()

callback && callback()

}

else if (_this.ws.readyState === 0) { // 连接中状态 ,轮询查询连接

eventPoll(poll, 1, 500, () => {

_this.ws.send(value)

_this.$soctket_heartSoctket()

callback && callback()

})

}

else { // 失败重新连接

_this.$soctket_init(() => {

_this.$soctket_emit(value, callback)

})

}

}

这个就是之前提到的emit 触发器 用来在vue中调用, 来向服务端发起数据通信,就实现了双向的数据通信, 里边有一个轮询器 来轮询eventPoll ,websocket 的状态是否是已经连通的状态

,那么在Vue文件中是怎么调用emit的呢 ,很简单就是调用vuex中之前绑定的state里边的wx

const { ws } = this.$store.state.socket

ws.$soctket_emit(JSON.stringify({

data: 'hello , world'

}), () => {

console.log('发送成功')

})

就是这么简单触发的。以上整个机制都已经讲解了一边,那么还有心跳机制,给大家介绍一下

/**

* 心脏搏动机制->防止断开连接

*/

socket.prototype.$soctket_heartSoctket = function () {

if (this.timer) clearTimeout(this.timer)

console.log(this.timer)

this.timer = setTimeout(() => {

if (this.ws.readyState === 1 || this.ws.readyState === 0) {

this.ws.send('heart , socket')

this.$soctket_heartSoctket()

} else {

this.$soctket_init()

}

}, 59000)

就是不断向服务端发起消息,来防止断开连接。

还有两个方法来控制ws的连接和关闭

/**

* 开启,关闭 socket

*/

/**

* 关闭socket连接

*/

socket.prototype.$soctket_close = function () {

if (this.timer) clearTimeout(this.timer)

if (this.errorResetTimer)clearTimeout(this.errorResetTimer)

this.closeWs = true

this.ws.close()

}

/**

* 重启socket连接

*/

socket.prototype.$soctket_open = function () {

if (!this.closeWs) {

throw new Error('socket is connected')

}

this.timer = null

this.errorResetNumber = 0

this.closeWs = false

this.errorFrom = 0

this.errorResetTimer = null

this.errorDispatchOpen = true

this.heartSocketOpen = false

this.closeWs = false

this.$soctket_init()

}

小程序的socket连接和h5 的差不多一个体系,也是用公共管理进行连接 , 不过commit的传递方式和h5有点出入,这里就不解释了,这套体系在项目中还是比较稳定的**,喜欢的朋友欢迎来到gitHub上下载源码

你可以在github上找到源码[here][1].

链接: [link]https://github.com/laoxiedabaojian/websocket-vue-react-.git

https://github.com/laoxiedabaojian/websocket-vue-react-

谢谢大家~~~~

h5和小程序socket长连接和公共管理方案(vue+redux+websocket)相关教程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

小程序跟服务器长连接,h5和小程序socket长连接和公共管理方案(vue+redux+websocket)... 的相关文章

  • [矩阵的三角分解系列五] 三角分解中的行列变换

    三角分解中的行列变换 简介 行变换分解 置换矩阵 PLU分解 证明 例子 引用 矩阵的三角分解是求解线性方程组常用的方法 包括LU分解 LDU分解 杜利特 Doolittle 分解 克劳特 Crout 分解 LLT 乔累斯基Cholesky
  • css 伪类清除浮动,CSS中盒模型、浮动以及清除浮动的方法

    盒模型 在 htm 中每一个元素都可以看成是一个盒子 默认情况下盒子的边框是无 背景色是透明的 所以在默认情况下看不到盒子 盒子由 margin border padding content 盒子中的内容 四部分组成 1 margin 元素
  • Redis内存被占满的解决办法(淘汰策略)

    Redis在实际使用中 肯定会遇到内存占满的问题 那么该如何解决这个问题呢 1 增加内存 不推荐 因为即使加大内存 以后还是会有内存被占满的可能 不能根本解决问题 2 使用Redis Cluster 关于Redis Cluster参考Red
  • 【深度学习】 Python 和 NumPy 系列教程(十):NumPy详解:2、数组操作(索引和切片、形状操作、转置操作、拼接操作)

    目录 一 前言 二 实验环境 三 NumPy 0 多维数组对象 ndarray 1 多维数组的属性 1 创建数组 2 数组操作 1 索引和切片 a 索引 b 切片 2 形状操作 a 获取数组形状 b 改变数组形状 c 展平数组 3 转置操作
  • 聚类算法(K-means & AGNES & DBSCAN)

    一 聚类算法基本概念 1 定义 聚类就是按照某个特定标准 如距离准则 把一个数据集分割成不同的类或簇 使得同一个簇内的数据对象的相似性尽可能大 即聚类后同一类的数据尽可能聚集到一起 不同数据尽量分离 简单来讲就是把相似的东西分到一起 2 无
  • 哈工大2021机器学习期末考试题

    一 说明参数正则化和参数后验之间的联系 并解释在机器学习模型参数估计中使用正则化的目的 二 给出条件熵的定义 举一个本课程中应用该方法的例子 说明使用条件熵的好处 给出你的直观解释 三 朴素贝叶斯的基本假设是什么 有什么好处 当假设满足时
  • webpack : 无法加载文件 C:\Users\12987\AppData\Roaming\npm\webpack.ps1,因为在此系统上禁止运行脚本。

    通过查询综合了意见给出以下解决办法 webpack src index js o build built js mode development出现的问题 解决 1 管理员身份cmd输入 set ExecutionPolicy Remote
  • ubuntu 18.04 安装 opencv-2.4.13.6

    ubuntu 18 04 安装 opencv 2 4 13 6 1 opencv 2 4 13 6下载 2 安装opencv 2 4 13 6 1 解压opencv 2 4 13 6 zip到根目录下 2 安装opencv 2 4 13 6
  • 几个友好Java代码习惯建议

    我工作多年 遇到过各种各样的同事 我见过各种代码 优秀的 垃圾的 没有吸引力的等等 所以这篇文章记录了一个优秀的Java开发应该具备哪些良好的开发习惯或最佳实践 1 封装方法参数 当你的方法参数过多时 建议封装一个对象 下面是反面教材 谁教
  • 理解傅里叶分析

    一 什么是频域 从我们出生 我们看到的世界都以时间贯穿 股票的走势 人的身高 汽车的轨迹都会随着时间发生改变 这种以时间作为参照来观察动态世界的方法我们称其为时域分析 而我们也想当然的认为 世间万物都在随着时间不停的改变 并且永远不会静止下
  • 【Mybatis】mybatis3入门

    mybatis简介 MyBatis 是一款优秀的持久层框架 它支持定制化 SQL 存储过程以及高级映射 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 MyBatis 可以使用简单的 XML 或注解来配置和映射
  • 【经验分享】- 这是一份来自 IT 男的电脑使用建议

    这是一份来自 IT 男的电脑使用建议 1 写在前面 2018 年高考结束我拿到了第一台笔记本电脑 此前对电脑接触地并不多 因此在这几年的电脑使用过程中积累了一些个人使用经验和使用技巧想要分享给可能还是电脑小白的你 个人一直以来用的还是 Wi
  • 自己动手定制Chromium系列之四:Chromium 58的一个编译配置

    aec untrusted delay for testing Current value from the default false From third party webrtc modules audio processing BU
  • (成功解决)Python连接clickhouse

    第一次尝试用Python连接clickhouse数据库 踩了不少坑 特此记录 帮助后人少犯错 运行环境 python 3 8 3 clickhouse driver 0 2 3 clickhouse sqlalchemy 0 2 0 sql
  • Linux-(C/C++)动态链接库生成以及使用(libxxx.so)

    linux静态库生成与使用 http www cnblogs com johnice archive 2013 01 17 2864319 html Linux中so文件为共享库 与windows下dll类似 不过实现要简单 so可以供多个
  • 小熊错误_小熊派4G开发板初体验

    开发板硬件资源介绍 前阵子小熊派发布了一款超高性价比的4G开发板 但是板子仅限量1000套 小熊派官方给我送了一块 我们一起来学习学习 板子做得小巧精致 控制核心用的是移远的EC100Y LTE Cat1无线通信模组 该模组可对所有用户开放
  • Python开发环境Wing IDE如何使用调试功能

    在使用Wing IDE开始调试的时候 需要设置断点的行 读取GetItemCount函数的返回 这可以通过单击行并选择Break工具栏条目 或通过单击行左边的黑色边缘 断点应该以实心红圈的形式出现 接下来使用绿色箭头图标开始调试或在Debu
  • 基于微信小程序的健身小助手小程序

    文末联系获取源码 开发语言 Java 框架 ssm JDK版本 JDK1 8 服务器 tomcat7 数据库 mysql 5 7 8 0 数据库工具 Navicat11 开发软件 eclipse myeclipse idea Maven包
  • Mysql中分组后取最新的一条数据

    在 SQL 中 你可以使用子查询和 ORDER BY 子句来实现按照特定字段进行分组 并获取每个分组中最新的一条记录 SELECT t1 FROM your table t1 INNER JOIN SELECT id MAX timesta

随机推荐

  • 云技术平台赋能媒体融合发展创新

    欢迎大家前往腾讯云技术社区 获取更多腾讯海量技术实践干货哦 作者 熊普江 媒体行业是传统而又新兴的行业 在数字化 信息化 移动化快速演进的今天 无论是用户 社会还是行业 政府都意识到 传统媒体与新兴媒体融合发展是必然之路 但媒体融合需要内容
  • 2021-07-14 React 代码规范整理

    文章目录 React 代码规范 1 基础规则 2 组件声明 1 组件名称和定义该组件的文件名称建议要保持一致 2 不要使用 displayName 属性来定义组件的名称 应该在 class 或者 function 关键字后面直接声明组件的名
  • 烟花代码

    div div
  • 日志-Log4J

    日志 程序中的日志可以用来记录程序在运行的时候点点滴滴 并可以进行永久存储 日志和输出语句的区别 输出语句 日志技术 取消日志 需要修改代码 灵活性比较差 不需要修改代码 灵活性比较好 输出位置 只能是控制台 可以将日志信息写入到文件或者数
  • R语言之 as.formula()

    今天学到一个东西 R 语言回归函数里面的公式函数 as formula 其作用就是将字符串转换成公式 gt aa ReadCount Age BMI Sex HAMD 1 1 Sex gt aa 1 ReadCount Age BMI Se
  • MFC之滑块与旋转控件23

    1 滑块 首先看看滑块相关的内容 从sitch看到 滑块分为五个内容 分别是矩形滑块位置 滑块左右两边的箭头 和矩形滑块分别距离左右两边的空间 1 先添加滑块控件和显示矩形滑块的位置编辑区 2 右击编辑区添加变量为int类型 3 添加滑块为
  • Qt实现不同项目的信号传递

    Qt实现windows通信 不同项目的窗口通信 有关Qt通信的知识 windows要实现不同项目窗口通信 需要用类似于windows h的api接口 数据传输主要通过 typedef struct tagCOPYDATASTRUCT cds
  • nowcoder-15165-字符串问题-kmp

    题目描述 有一个字符串 让你找到这个字符串 S 里面的子串T 这个子串 T 必须满足即使这个串的前缀 也是这个 串的后缀 并且 在字符串中也出现过一次的 提示 要求满足前后缀的同时也要在字符串中出现一次 只是前后缀可不行 输出最长满足要求字
  • Shell脚本进阶版合集

    文章目录 一 Linux监控服务端口脚本 二 Linux编译安装Nginx脚本 三 Linux监控一个主机状态脚本 四 Linux统计内存 CPU使用前十进程脚本 五 Linux 磁盘I O列长度监控脚本 六 Linux计算内存使用率占比
  • 【多元统计分析】09.独立性检验与正态性检验

    文章目录 九 独立性检验和正态性检验 1 独立性检验 2 一元数据正态性检验 3 多元数据的正态性检验 回顾总结 九 独立性检验和正态性检验 1 独立性检验 独立性检验 指的是将一个多元总体 X N p
  • 【cmake】find_package设置查找路径

    1 find package的作用与实例 用来查找第三方依赖包的 cmake文件 并根据 cmake文件生成依赖包的头文件目录和库文件路径等 CMakeLists txt实例 find package Protobuf REQUIRED i
  • [大话设计模式C++版] 第14章 老板回来,我不知道 —— 观察者模式

    源码可以在这里找到 大话设计模式C 版 双向耦合的代码 Secretary h 秘书类 include
  • numpy对array索引

    numpy中array索引 对numpy的array索引时总是容易出错 借此机会总结一下numpy中array最常用的索引方法 1 单个元素的索引 In 1 1 1 一维array 单个元素的索引使用整数 import numpy as n
  • 能把百度玩出花样的人肯定不简单,分享几个鲜为人知的搜索引擎高级语法

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 专栏简介 此文章已录入专栏 网络安全快速入门 渗透过程中 通常会使用搜索引擎来收集重要信息 确定攻击点 Google 黑客语法
  • 牛客题集——Cook Steak(警示 理解题意)

    Cook Steak 题目链接 题目译文 对于烤牛排 ZJH认为它需要N道烧烤工序 每道工序都在一个温度范围内 li ri 就一分钟而言 只有在这种情况下 烤牛排才是最好的 幸运的是 厨房里的设备已经配备了人工智能 可以在最短的时间内快速完
  • 浏览器缓存的位置

    缓存位置的类型 缓存位置有四种 各自有优先级 当依次查找缓存且都没有命中的时候 才会去请求网络 Service Worker Memory Cache Disk Cache Push Cache Service Worker Service
  • Web基础(从零开始)——HTML下拉菜单 select标签详解

  • 设计模式【15】——状态模式(State模式)

    文章目录 前言 一 状态模式 State模式 二 具体源码 1 State h 2 State cpp 3 Context h 4 Context cpp 5 main cpp 三 运行结果 总结 前言 每个人 事物在不同的状态下会有不同表
  • mysql实训总结日记_常用SQL语句总结-MySQL 学习日记

    写在前面 下面主要总结的是SQL的数据类型和DDL DML和DCL的基础用法 适合查阅 纯结构化文本读起来需要耐心 勤于练习 勤于练习 勤于练习 2018 05 30第一次修改 SQL Structured Query Language结构
  • 小程序跟服务器长连接,h5和小程序socket长连接和公共管理方案(vue+redux+websocket)...

    h5和小程序socket长连接和公共管理方案 vue redux websocket h5和小程序socket长连接和公共管理方案 vue redux websocket socket和公共状态管理连接方案 vuex redux和小程序 w