//是否已经连接上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, '这个是后端推送的数据');
},