gy-app-shop/utils/websocket.js

86 lines
2.0 KiB
JavaScript

class websocketUtil {
constructor(url, time) {
console.log("url: ", url)
this.is_open_socket = false //避免重复连接
this.url = url //地址
this.data = null
//心跳检测
this.timeout= time //多少秒执行检测
this.heartbeatInterval= null //检测服务器端是否还活着
this.reconnectTimeOut= null //重连之后多久再次重连
try {
return this.connectSocketInit()
} catch (e) {
console.log('catch');
this.is_open_socket = false
this.reconnect();
}
}
// 进入这个页面的时候创建websocket连接【整个页面随时使用】
connectSocketInit() {
this.socketTask = uni.connectSocket({
url: this.url,
success:()=>{
console.log("正准备建立websocket中...");
// 返回实例
return this.socketTask
},
});
// 这里仅是事件监听【如果socket关闭了会执行】
// this.socketTask.onClose((res) => {
// console.log("已经被关闭了", res);
// this.is_open_socket = false;
// if(res.code != 4000){ //不是主动关闭就重连
// this.reconnect();
// }
// })
}
//发送消息
send(value){
// 注:只有连接正常打开中 ,才能正常成功发送消息
this.socketTask.send({
data: value,
async success() {
console.log("消息发送成功");
},
});
}
//开启心跳检测
start(){
this.heartbeatInterval = setTimeout(()=>{
this.data={value:"传输内容",method:"方法名称"}
console.log(this.data)
this.send(JSON.stringify(this.data));
},this.timeout)
}
//重新连接
reconnect(){
//停止发送心跳
clearInterval(this.heartbeatInterval)
//如果不是人为关闭的话,进行重连
if(!this.is_open_socket){
this.reconnectTimeOut = setTimeout(()=>{
this.connectSocketInit();
},3000)
}
}
close() {
this.socketTask.close({
code: 4000,
reason: '主动关闭',
async success() {
console.log('主动关闭');
},
fail(err) {
console.log('调用close函数失败', err);
}
});
}
}
export default websocketUtil;