封装支付宝小程序 建立socket 连接

//是否已经连接上ws
let isOpenSocket = false
//心跳间隔,单位毫秒
let heartBeatDelay = 3000
let heartBeatInterval = null
//心跳时发送的消息文本
let heartBeatText = "PING"
//最大重连次数
let reconnectTimes = 10
let reconnectInterval = null
//重连间隔,单位毫秒
let reconnectDelay = 3000
let SocketTask = null

//这个参数是防止重连失败之后onClose方法会重复执行reconnect方法,导致重连定时器出问题
//连接并打开之后可重连,且只执行重连方法一次
let canReconnect = false


//init方法 初始化SocketTask对象
//completeClose方法 完全将SocketTask关闭(不重连)
let ws = {
    SocketTask: null,
    init,
    completeClose,
    send
}

function init(sockeUrl, onReceive) {
    SocketTask = uni.connectSocket({
        url: sockeUrl,
        complete: (res) => {
            console.log("WebSocket连接成功", res)
        }
    })
    my.onSocketOpen((res) => {
        console.log("WebSocket连接已打开", res)
        clearInterval(heartBeatInterval)
        clearInterval(reconnectInterval)
        isOpenSocket = true
        canReconnect = true
        //开启心跳机制  向websocket发送数据,json格式,参数:sceneId
        heartBeat()
    })
    my.onSocketMessage((res) => {
        let result = res.data
        onReceive(result);
    })
    my.onSocketClose(() => {
        if (isOpenSocket) {
            console.log("ws与服务器断开")
        } else {
            console.log("连接失败")
        }
        isOpenSocket = false
        if (canReconnect) {
            reconnect()
            canReconnect = false
        }
    })
    SocketTask = SocketTask
}

function heartBeat() {
    heartBeatInterval = setInterval(() => {
        // console.log(heartBeatText)
        uni.getSystemInfo({
            success: function(res) {
                uni.setStorageSync('deviceId', res.deviceId)
                let obj = {
                    sceneId: '心跳ing'
                }
                send(JSON.stringify(obj));
            }
        });

    }, heartBeatDelay)
}

// 发送消息
function send(value) {
    my.sendSocketMessage({
        data: value,
        async success(res) {
            // console.log("消息发送成功",res)
        }
    });
}

function reconnect() {
    //停止发送心跳
    clearInterval(heartBeatInterval)
    //如果不是人为关闭的话,进行重连
    if (!isOpenSocket) {
        let count = 0;
        reconnectInterval = setInterval(() => {
            console.log("正在尝试重连")
            init();
            count++
            //重连一定次数后就不再重连
            if (count >= reconnectTimes) {
                clearInterval(reconnectInterval)
                console.log("网络异常或服务器错误")
            }
        }, reconnectDelay)
    }
}

function completeClose() {
    //先将心跳与重连的定时器清除
    clearInterval(heartBeatInterval)
    clearInterval(reconnectInterval)
    canReconnect = false
    my.closeSocket({
        success: (result) => {
            console.log(result, "socket已关闭成功")
        },
        fail: (err) => {
            console.log(err, "报错")
        },
        complete: (res) => {
            console.log(res, "0000000000000000000")
        }
    })
}

module.exports = ws
 

以上封装好的支付宝小程序socket连接 
之后在要用的页面里调用

要先引入我们封装好的socket.ks

websocetObj.init('socketURL', this.getWebsocetData, ) 

连接成功以后 调用getWebsocetData 方法

            getWebsocetData(val) {
                console.log(val, '这个是后端推送的数据');
            },

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值