Blogger Information
Blog 7
fans 0
comment 1
visits 11579
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
微信小程序全局websocket
Original
960 people have browsed it

在微信小程序中,我们自己写的聊天室,用到websocket时在单页面创建ws ,重复与服务器创建连接占用资源的同时也影响效率,所以就是使用了全局websocket ,创建连接一次不出意外可以一直使用这个实例,废话就不多说了,直接上代码吧!

 

首先创建配置文件

在根目录的 utils(如果没有那就创建一个) 创建 setting.js 文件 ,文件内容如下

/utils/setting.js

实例

module.exports = {
    ws: '',  // ws 连接地址
    wsDisconnectTime: 3000,  //每次断开连接时间
    wsLikeTime: 3000,  // ws 心脏包发送的时间 毫秒
}

接下来就是 webSocket主逻辑文件

在根目录的 utils(如果没有那就创建一个) 创建 webSocket.js 文件 ,文件内容如下

/utils/webSocket.js

实例

var setting = require('setting.js');
module.exports = {
    ws: {}, // 实例
    wsHeartTime: {}, //心脏的时间
    is_log: 0, //记录登录次数
    eventMap: {}, // 事件字典
    on(event,fn){
        this.eventMap[event] = fn;
    },
    emit(event,data){
        this.eventMap[event](data)
    },
    /**
     * 连接
     * @param {boolean} count 连接次数
     * @param {boolean} type 登录类型 user=用户,admin=admin 
     * @author: wmq
     * @Time: 2022/8/18 13:54
     */
    init() {
        let that = this;
        let ws = wx.connectSocket({
            url: setting.ws,
            success:e => { }
        })
        ws.onOpen(data => {
            that.emit('onOpen',{})
            //先发送一次心脏
            ws.send({
                data: '{"controller":"worker","method":"heartbeat","data":""}'
            });
            console.log('连接成功');
            that.wsHeart()
        })
        ws.onError((error) => {
            console.log(error)
            that.wsHeart(false);
            setTimeout(() => {
                that.init();
            }, setting.wsDisconnectTime)
        })
        ws.onClose((error) => {
            that.wsHeart(false);
            setTimeout(() => {
                that.init();
            }, setting.wsDisconnectTime)
        })
        ws.onMessage(data => {
            data = JSON.parse(data.data);
            console.log(data);
        })
        that.ws = ws;
    },
    /**
     * 心跳检测
     * @param boolean status 登录类型 ture开启心跳  false 关闭心跳 
     * @author: wmq
     * @Time: 2022/8/18 13:54
     */
    wsHeart(status = true) {
        let that = this;

        if (status) {
            that.wsHeartTime = setInterval(function () {
                that.ws.send({
                    data: '{"controller":"worker","method":"heartbeat","data":""}'
                });
            }, setting.wsLikeTime)
        } else {
            clearInterval(that.wsHeartTime);
        }
    },

}

接下来配置就是使用方法了

在app.js 中创建实例,并禁用断开事件,断开后重新赋值给全局变量

/app.js

实例

// app.js
var ws = require('./utils/webSocket');
App({
    onLaunch() {
        ws.init()  //初始化 ws
        //监听断开时间,网咯断开,ws 断开都会执行这个回调
        ws.on('onOpen', () => { this.globalData.ws = ws.ws })
    },                                                                                                                                                                
    globalData: {
        ws: {},  // ws 实例
      
    }
})

在页面种使用

实例

//在页面最上面先
  const app = getApp()
//在方法中let ws = app.globalData.ws;
//接受信息
ws.onMessage(data => {
    data = JSON.parse(data.data);
})
//发送信息
ws.send()



Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post