skyeyesystem/frontend/Skyeye-sys-ui/src/api/wssocket.js
2026-01-25 16:02:00 +08:00

147 lines
3.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

var websock = null;
let rec; //断线重连后延迟5秒重新创建WebSocket连接 rec用来存储延迟请求的代码
let isConnect = false; //连接标识 避免重复连接
let connectCallBack = null;
let messageCallBack = null;
let closeCallBack = null
let connect = (wsurl, accessToken) => {
try {
if (isConnect) {
return;
}
console.log("连接WebSocket");
websock = new WebSocket(wsurl);
websock.onmessage = function (e) {
let sendInfo = JSON.parse(e.data)
console.log('收到消息', sendInfo)
if (sendInfo.cmd == 0) {
heartCheck.start()
// 登录成功才算真正完成连接
connectCallBack && connectCallBack();
console.log('WebSocket登录成功')
} else if (sendInfo.cmd == 1) {
// 重新开启心跳定时
heartCheck.reset();
} else {
// 其他消息转发出去
console.log("收到消息:", sendInfo);
messageCallBack && messageCallBack(sendInfo.cmd, sendInfo.data)
}
}
websock.onclose = function (e) {
console.log('WebSocket连接关闭')
isConnect = false; //断开后修改标识
closeCallBack && closeCallBack(e);
}
websock.onopen = function () {
console.log("WebSocket连接成功");
isConnect = true;
// 发送登录命令
let loginInfo = {
cmd: 0,
data: {
accessToken: accessToken
}
};
websock.send(JSON.stringify(loginInfo));
}
// 连接发生错误的回调方法
websock.onerror = function () {
console.log('WebSocket连接发生错误')
isConnect = false; //连接断开修改标识
reconnect(wsurl, accessToken);
}
} catch (e) {
console.log("尝试创建连接失败");
reconnect(wsurl, accessToken); //如果无法连接上webSocket 那么重新连接!可能会因为服务器重新部署,或者短暂断网等导致无法创建连接
}
};
//定义重连函数
let reconnect = (wsurl, accessToken) => {
console.log("尝试重新连接");
if (isConnect) {
//如果已经连上就不在重连了
return;
}
rec && clearTimeout(rec);
rec = setTimeout(function () { // 延迟5秒重连 避免过多次过频繁请求重连
connect(wsurl, accessToken);
}, 15000);
};
//设置关闭连接
let close = (code) => {
websock && websock.close(code);
};
//心跳设置
let heartCheck = {
timeout: 5000, //每段时间发送一次心跳包 这里设置为20s
timeoutObj: null, //延时发送消息对象(启动心跳新建这个对象,收到消息后重置对象)
start: function () {
if (isConnect) {
console.log('发送WebSocket心跳')
let heartBeat = {
cmd: 1,
data: {}
};
websock.send(JSON.stringify(heartBeat))
}
},
reset: function () {
clearTimeout(this.timeoutObj);
this.timeoutObj = setTimeout(function () {
heartCheck.start();
}, this.timeout);
}
};
// 实际调用的方法
let sendMessage = (agentData) => {
if (websock.readyState === websock.OPEN) {
// 若是ws开启状态
websock.send(JSON.stringify(agentData))
} else if (websock.readyState === websock.CONNECTING) {
// 若是 正在开启状态则等待1s后重新调用
setTimeout(function () {
sendMessage(agentData)
}, 1000)
} else {
// 若未开启 则等待1s后重新调用
setTimeout(function () {
sendMessage(agentData)
}, 1000)
}
}
let onConnect = (callback) => {
connectCallBack = callback;
}
let onMessage = (callback) => {
messageCallBack = callback;
}
let onClose = (callback) => {
closeCallBack = callback;
}
// 将方法暴露出去
export {
connect,
reconnect,
close,
sendMessage,
onConnect,
onMessage,
onClose,
}