asd/asd-wx/common/utils/websocket.js

111 lines
2.9 KiB
JavaScript
Raw Normal View History

2024-11-21 11:32:11 +08:00
import {SOCKETAPI1} from "@/common/utils/config.js"
import store from '@/common/store'
var socketTask = {}
function connectSocketInit(state) {
//保存是否是断开重连的
store.commit("setPropName", {
propName: 'socketState',
value: state
});
// 创建一个socketTask对象【发送、接收、关闭socket都由这个对象操作】
socketTask = uni.connectSocket({
// 【非常重要】必须确保你的服务器是成功的,如果是手机测试千万别使用ws://192.168.31.25:9099【特别容易犯的错误】
url: SOCKETAPI1+store.state.userInfo.id,
success(data) {
//设置是否是手动关闭的
store.commit("setPropName", {
propName: 'closeWebSocket',
value: false
});
},
});
socketTask.onOpen((res) => {
console.log("WebSocket连接正常");
clearTimeout(store.state.reconnectTimeOut)
clearTimeout(store.state.heartbeatInterval)
//socket设置为打开状态
store.commit("setPropName", {
propName: 'is_open_socket',
value: true
});
store.commit("start");
// 注:只有连接正常打开中 ,才能正常收到消息
socketTask.onMessage((res) => {
let message = Object.assign({socketState:store.state.socketState},JSON.parse(res.data))
store.commit('updateSocketMessage', message);
});
})
// 这里仅是事件监听【如果socket关闭了会执行】
socketTask.onClose(() => {
console.log("已经被关闭了")
//设置socket为关闭
store.commit("setPropName", {
propName: 'is_open_socket',
value: false
});
if(!store.state.closeWebSocket){
store.commit("reconnect");
}
})
socketTask.onError(() => {
console.log("websocket连接异常")
})
//将socket存到store中
store.commit("setPropName", {
propName: 'socket',
value: socketTask
});
//将socket存到内存中
uni.setStorageSync("SOCKET", socketTask);
}
//开启心跳检测
// function start(){
// heartbeatInterval = setTimeout(()=>{
// console.log("心跳");
// socketTask.send({
// data: "请求一次发送一次message",
// async success() {
// console.log("消息发送成功");
// },
// fail(){
// console.log("发送失败,重新连接....");
// }
// });
// },3000)
// }
//重新连接
function reconnect(){
//停止发送心跳
clearInterval(heartbeatInterval)
//如果不是人为关闭的话,人为关闭就是在退出的时候,进行重连
if(!store.state.is_open_socket){
reconnectTimeOut = setTimeout(()=>{
socketState = 1;
connectSocketInit(1);
},3000)
}
}
// 关闭websocket【离开这个页面的时候执行关闭】
function closeSocket() {
return new Promise((resolve, reject) => {
socketTask.close({
success(res) {
is_open_socket = false;
closeWebSocket = true;
console.log("关闭成功", res)
resolve(res)
},
fail(err) {
console.log("关闭失败", err)
}
})
})
}
export {
socketTask,
connectSocketInit,
closeSocket,
reconnect
};