uni-金沙1005

uni-app中websocket的使用 断开重连、心跳机制说明:下图针对两个tab项,只希望在 tabindex = 0 触发websocket , 如果点击第二个栏目 , tabindex = 1则主

最近关于h5和app的开发中使用到了websocket,由于web/app有时候会出现网络不稳定或者服务端主动断开,这时候导致消息推送不了的情况,需要客户端进行重连。查阅资料后发现了一个心跳机制,也就是客户端间隔一段时间就向服务器发送一条消息,如果服务器收到消息就回复一条信息过来,如果一定时间内没有回复,则表示已经与服务器断开连接了,这个时候就需要进行重连。

被动断开则进行重连,主动断开,不重连。

说明:下图针对两个tab项(open trades 和 closed trades),只希望在 tabindex = 0 (open trades 高亮时)触发websocket , 如果点击第二个栏目 , tabindex = 1(closed trades高亮时)则主动关闭websodket连接。

tabindex = 0 时 ,被动断开则自动重连

原文链接:uni-app中websocket的使用 断开重连、心跳机制

1.webscoket连接并接收推送的消息

uni-app中websocket的使用 断开重连、心跳机制

2.将接收的消息转换成目标数据,并渲染

uni-app中websocket的使用 断开重连、心跳机制

3.如果主动关闭,则不进行重连,监听关闭事件

uni-app中websocket的使用 断开重连、心跳机制

4.显示已关闭,不重连

uni-app中websocket的使用 断开重连、心跳机制

5.监听错误事件,比如地址,协议错误等,则会自动重连五次,五次重连仍失败后则需要进行手动重连

uni-app中websocket的使用 断开重连、心跳机制
uni-app中websocket的使用 断开重连、心跳机制
uni-app中websocket的使用 断开重连、心跳机制

6.如果服务端主动断开,心跳机制会每隔一段时间发送一条数据给服务端,如果没有回复则会进行webscoket重连。

uni-app中websocket的使用 断开重连、心跳机制
uni-app中websocket的使用 断开重连、心跳机制
  1. 新建 socket.js , 将以下代码复制进去 ,向外暴露。
import api from '@/common/js/config.js' // 接口api,图片地址等等配置,可根据自身情况引入,也可以直接在下面url填入你的 websocket连接地址class socketio {    constructor(data, time, url) {        this.sockettask = null        this.is_open_socket = false //避免重复连接        this.url = url ? url : api.websocketurl  //连接地址        this.data = data ? data : null        this.connectnum = 1 // 重连次数        this.traderdetailindex = 100 // traderdetailindex ==2 重连        this.accountstateindex = 100 // traderdetailindex ==1 重连        this.followflake = false // traderdetailindex == true 重连        //心跳检测        this.timeout = time ? time : 15000 //多少秒执行检测        this.heartbeatinterval = null //检测服务器端是否还活着        this.reconnecttimeout = null //重连之后多久再次重连    }    // 进入这个页面的时候创建websocket连接【整个页面随时使用】    connectsocketinit(data) {        this.data = data        this.sockettask = uni.connectsocket({            url: this.url,            success: () => {                console.log("正准备建立websocket中...");                // 返回实例                return this.sockettask            },        });        this.sockettask.onopen((res) => {            this.connectnum = 1            console.log("websocket连接正常!");            this.send(data)            clearinterval(this.reconnecttimeout)            clearinterval(this.heartbeatinterval)            this.is_open_socket = true;            this.start();            // 注:只有连接正常打开中 ,才能正常收到消息            this.sockettask.onmessage((e) => {                // 字符串转json                let res = json.parse(e.data);                console.log("res---------->", res) // 这里 查看 推送过来的消息                if (res.data) {                    uni.$emit('getpositonsorder', res);                 }            });        })        // 监听连接失败,这里代码我注释掉的原因是因为如果服务器关闭后,和下面的onclose方法一起发起重连操作,这样会导致重复连接        uni.onsocketerror((res) => {            console.log('websocket连接打开失败,请检查!');            this.sockettask = null            this.is_open_socket = false;            clearinterval(this.heartbeatinterval)            clearinterval(this.reconnecttimeout)            uni.$off('getpositonsorder')            if (this.connectnum < 6) {                uni.showtoast({                    title: `websocket连接失败,正尝试第${this.connectnum}次连接`,                    icon: "none"                })                this.reconnect();                this.connectnum  = 1            } else {                uni.$emit('connecterror');                this.connectnum = 1            }        });        // 这里仅是事件监听【如果socket关闭了会执行】        this.sockettask.onclose(() => {            console.log("已经被关闭了-------")            clearinterval(this.heartbeatinterval)            clearinterval(this.reconnecttimeout)            this.is_open_socket = false;            this.sockettask = null            uni.$off('getpositonsorder')            if (this.connectnum < 6) {                this.reconnect();            } else {                uni.$emit('connecterror');                this.connectnum = 1            }        })    }    // 主动关闭socket连接    close() {        if (!this.is_open_socket) {            return        }        this.sockettask.close({            success() {                uni.showtoast({                    title: 'sockettask 关闭成功',                    icon: "none"                });            }        });    }    //发送消息    send(data) {        console.log("data---------->", data);        // 注:只有连接正常打开中 ,才能正常成功发送消息        if (this.sockettask) {            this.sockettask.send({                data: json.stringify(data),                async success() {                    console.log("消息发送成功");                },            });        }    }    //开启心跳检测    start() {        this.heartbeatinterval = setinterval(() => {            this.send({                "traderid": 10260,                "type": "ping"            });        }, this.timeout)    }    //重新连接    reconnect() {        //停止发送心跳        clearinterval(this.heartbeatinterval)        //如果不是人为关闭的话,进行重连        if (!this.is_open_socket && (this.traderdetailindex == 2 || this.accountstateindex == 0 || this            .followflake)) {            this.reconnecttimeout = setinterval(() => {                this.connectsocketinit(this.data);            }, 5000)        }    }    /**     * @description 将 scoket 数据进行过滤      * @param {array} array     * @param {string} type 区分 弹窗 openposition 分为跟随和我的     */    arrayfilter(array, type = 'normal', signalid = 0) {        let arr1 = []        let arr2 = []        let obj = {            arr1: [],            arr2: []        }        arr1 = array.filter(v => v.flwsig == true)        arr2 = array.filter(v => v.flwsig == false)        if (type == 'normal') {            if (signalid) {                arr1 = array.filter(v => v.flwsig == true && v.sigtraderid == signalid)                return arr1            } else {                return arr1.concat(arr2)            }        } else {            if (signalid > 0) {                arr1 = array.filter(v => v.flwsig == true && v.sigtraderid == signalid)                obj.arr1 = arr1            } else {                obj.arr1 = arr1            }            obj.arr2 = arr2            return obj        }    }}module.exports = socketio
  1. 在入口文件中 将 socketio 挂载在 vue 原型上 , 也可以按需引入置顶页面 。
import socketio from '@/common/js/scoket.js'vue.prototype.socketio = new socketio()
  1. 在需要用到websocket的页面中使用如下方法(可根据自身业务需求进行整改)
scoketclose() {    this.socketio.connectnum = 1    const data = {        "value1": "demo1"        "value2": "demo2"    }    this.socketio.send(data) // 这是给后端发送特定数据 关闭推送    this.socketio.close() // 主动 关闭连接 , 不会重连},getwebsocketdata() {    // 要发送的数据包    const data = {        "value": "value1",        "type": "type1"    }    // 打开连接    this.socketio.connectsocketinit(data)    // 接收数据    uni.$on("getpositonsorder", (res) => {        this.connect = true        const {            code,            data        } = res        if (code == xxxx) {            // 根据后端传过来的数据进行 业务编写。。。        } else {        }    })    // 错误时做些什么    uni.$on("connecterror", () => {        this.connect = false        this.scoketerror = true    })}
  1. 离开页面,记得断开连接。
onunload() {    this.scoketclose()    this.socketio.traderdetailindex = 100 // 初始化 tabindex }

如果在使用中遇到什么问题 ,可以给我 留言 ,看到留言后会在第一时间进行回复 。

js555888金沙老品牌的版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由思创斯整理,转载请注明出处:https://ispacesoft.com/124501.html

(0)

相关推荐

  • uni-app返回页面强制刷新问题[通俗易懂]

    uni-app返回页面强制刷新问题[通俗易懂]首先设置ifonshow不然会一直循环刷新,而且当返回当前页面时onhide()赋值内容不会改变,此时ifonshow的值为true所以onshow()会触发强制刷新页面ifonshow:boolean=false;//首先设置ifonshow不然会一直循环刷新onhide(){uni.hideloading();this.ifonshow=true;}publiconshow(){if(this.ifonshow==tr

  • 属性type=’primary/default/warn’颜色分别为蓝色/灰白色/红色size=’mini/default’按钮大小plain是否背景为空,只有边框,默认为否loading文本前是否有加载动画,默认为否disable是否禁用,默认为否hover-class=”类名”按下的样式hover-stop-propagation 是否阻止冒泡,默认不…

  • uniapp打包成安卓_uniapp最多打包几次

    uniapp打包成安卓_uniapp最多打包几次本文使用cli方式一、android原生配置官方文档0安装开发环境必备软件:androidstudiohbuilderx小程序android离线sdk,下载版本sdk(一般是最新版。版本要与hbuilderx版本一致,检查版本的方法看下面导出app资源小节)申请appkey登录开发者中心。如果没有账号,就注册一个。申请appkey需要进行邮箱和手机号的实名认证。在左侧菜单中选择我创建的应用,点击应用左侧选择离线打包key管理,选择对应平台iosandroid

  • vue,uni-app 移动端ui框架(组件库)

    vue,uni-app 移动端ui框架(组件库)一、vantui轻量、可靠的移动端vue组件库https://youzan.github.io/vant/#/zh-cn/intro二、uview:多平台快速开发的ui框架。https://www.uviewui.com/components/intro.html三、museui基于vue2.0优雅的materialdesignui组件库。https://muse-ui.org/#/zh-cn四、cubeuididi.github.io/cub

  • 不用学习直接编写uni-app(hbuilder git 项目远程git获取)

    不用学习直接编写uni-app(hbuilder git 项目远程git获取)1、连接gita、首先安装[tortoisegit.org](https://tortoisegit.org/download/)【当然还得先安装git】○双击tortoisegit-2.8.0.0-64bit.msi,弹出安装导向页面↓一路next>即可,配置均选择默认…

  • uni-app填坑{“errmsg“:“request:fail abort statuscode:-1“}uni-app填坑{“errmsg”:“request:failabortstatuscode:-1”}遇坑当我兴高采烈的封装了一个异步请求的方法之后,赶紧写了个测试后台进行网络请求,结果当我运行程序的时候h5端正常获取到参数,但是app端却报了这样的错误。16:11:19.304[vuewarn]:errorinonloadhook(promise/async):”[objectobject]”16:11:19.342(foundatpages/index/index.

  • uni-app 拖动滑块验证(插件分享)「建议收藏」

    uni-app 拖动滑块验证(插件分享)「建议收藏」插件地址:https://ext.dcloud.net.cn/plugin?id=573效果预览:作者:黄河爱浪qq:1846492969,邮箱:helang.love@qq.com公众号:web-7258,本文原创,著作权归作者所有,转载请注明原链接及出处。更多精彩文章,请扫下方二维码关注我的公众号…

  • uni-app 推送_推送push

    uni-app 推送_推送push(1)通知消息的推送 ,会在消息中心显示,点击通知启动(激活)应用到前台运行,触发“click”事件。 (2)透传数据的推送,可以响应click和receive。 发送透传数据的格式是标准格式({title:”通知标题”,content:”通知内容”,payload:”通知测试…

发表回复

您的电子邮箱地址不会被公开。

联系金沙1005

关注“java架构师必看”公众号

回复4,添加站长微信。

附言:ispacesoft.com网而来。

关注微信
网站地图