//连接websocket
connectSocket() {
let that = this;
console.log('调用连接websocket', `ws://172.16.1.152:11576/webSocket`)
this.socketTask = uni.connectSocket({
url: 'ws://172.16.1.152:11576/webSocket',
success(res) {
console.log("websocket连接成功");
// that.isSuccess = true
},
fail(err) {
console.log("报错", err);
}
},
);
this.socketTask.onOpen(function(res) {
console.log('WebSocket连接已打开!');
that.isSuccess = true
})
this.socketTask.onMessage(function(res) {
console.log('收到服务器内容:' + res.data);
if(res.data == '1') {
// 刷新伙食费分析数据
this.$refs['analysisExpenses'].getExpensesAnalysisShow();
}
// that.handlerMsg(JSON.parse(res.data)) //这里是对获取到的数据进行操作
});
this.socketTask.onError(function(res) {
console.log('WebSocket连接打开失败,请检查!');
console.log(res);
// this.isSuccess = false
this.connectSocket();
//进入重新连接
that.reconnect();
})
// // 监听连接关闭 -
this.socketTask.onClose((e) => {
console.log('WebSocket连接关闭!');
clearInterval(that.timer)
that.timer = ''
if (!that.isClose) {
that.reconnect()
}
})
console.log(this.socketTask)
},
//进入重新连接
reconnect() {
console.log('进入断线重连');
// this.socketTask.close();
this.socketTask = null;
this.connectSocket()
},
//发送消息
sendSocketMessage(msg) {
console.log('发送信息')
console.log(msg)
return new Promise((reslove, reject) => {
this.socketTask.send({
data: msg,
success(res) {
console.log('发送成功')
reslove(res)
},
fail(res) {
console.log('发送失败')
console.log(res)
reject(res)
}
});
})
},
// 心跳
heart() {
let that = this;
clearInterval(this.timer);
this.timer = '';
let msg = {
"type": "heartbeat",
}
this.timer = setInterval(() => {
that.sendSocketMessage(JSON.stringify(msg)).then(res => {
console.log('心跳成功')
}).catch(res => {
console.log('发送失败')
console.log((res))
})
}, 200000)
},
封装webSocket
/**
* 注册websocket
* @mask 支持promise返回,也支持回调返回
* @param path websocket地址
* @param onMsg 接收推送的回调函数
* @param onOpen 连接消息
* @param onErr 错误消息
* @returns {Promise}
*/
export function websocket(opt = {
path: '', onMsg: () => {
}, onOpen: () => {
}, onErr: () => {
}
}) {
return new Promise((resolve, reject) => {
console.log(opt.path);
try {
let ws = new WebSocket(opt.path)
let heartTimer
// 绑定消息
ws.onmessage = (msg) => {
if (msg.data !== 'heart') { // 非心跳包返回
if (opt.onMsg) opt.onMsg(msg, ws)
resolve(msg, ws);
}
}
ws.onopen = (event) => { // 绑定连接消息
if (opt.onOpen) opt.onOpen(event, ws);
heartTimer = setInterval(() => { // 连接成功后发2秒心跳包
ws.send('heart')
}, 2000)
}
ws.onerror = (err) => { // 绑定错误消息
console.log(err);
if (opt.onErr) opt.onErr(err, ws)
reject(err, ws);
clearTimeout(heartTimer)
}
ws.onclose = () => {
ws.close();
clearTimeout(heartTimer)
}
} catch (e) {
console.log(e);
reject();
}
})
}
export default websocket;