merchapp/java-mall-app-shop-admin/utils/socket.js

202 lines
5.1 KiB
JavaScript
Raw Permalink 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.

class WebsocketUtil {
constructor(url, time) {
this.is_open_socket = false; // 避免重复连接
this.url = url; // 地址
this.data = null;
// 心跳检测
this.timeout = time; // 多少秒执行检测
this.heartbeatInterval = null; // 检测服务器端是否还活着
this.reconnectInterval = null; // 重连之后多久再次重连
this.messageCallbacks = []; // 存储消息回调函数
this.store = null; // 存储Vuex store引用
try {
return this.connectSocketInit();
} catch (e) {
this.is_open_socket = false;
}
}
// 设置store
setStore(store) {
this.store = store;
}
// 创建WebSocket连接
connectSocketInit() {
if (this.is_open_socket) return;
this.socketTask = uni.connectSocket({
url: this.url,
success: () => {
this.is_open_socket = true;
return this.socketTask;
},
});
this.socketTask.onOpen((res) => {
clearInterval(this.reconnectInterval);
clearInterval(this.heartbeatInterval);
this.is_open_socket = true;
this.start();
this.socketTask.onMessage((res) => {
try {
const data = JSON.parse(res.data);
// 如果有store将数据存入store
if (this.store) {
this.store.commit("setWebSocketData", data);
}
// 执行所有注册的回调函数
this.messageCallbacks.forEach((callback) => callback(data));
} catch (e) {
console.error("WebSocket消息解析错误:", e);
}
});
});
this.socketTask.onError((res) => {
this.is_open_socket = false;
if (this.socketTask) {
this.socketTask.close();
}
});
this.socketTask.onClose(() => {
this.is_open_socket = false;
});
}
// 发送消息
send(value) {
if (!this.is_open_socket) return;
this.socketTask.send({
data: JSON.stringify(value),
success() {
console.log("消息发送成功", value);
},
fail(err) {
console.error("消息发送失败", err);
},
});
}
// 关闭连接
close() {
clearInterval(this.heartbeatInterval);
clearInterval(this.reconnectInterval);
this.is_open_socket = false;
if (this.socketTask) {
this.socketTask.close();
}
}
// 开启心跳检测
start() {
// this.heartbeatInterval = setInterval(() => {
// const heartbeatMsg = {
// type: 'heartbeat',
// userId: uni.getStorageSync('userinfo')?.user_id
// }
// this.send(heartbeatMsg)
// }, this.timeout)
}
// 重新连接
reconnect() {
clearInterval(this.heartbeatInterval);
if (!this.is_open_socket) {
this.reconnectInterval = setInterval(() => {
this.connectSocketInit();
}, 3000);
}
}
// 注册消息回调
onMessage(callback) {
this.messageCallbacks.push(callback);
}
// 移除消息回调
offMessage(callback) {
this.messageCallbacks = this.messageCallbacks.filter(
(cb) => cb !== callback
);
}
}
class WebSocketManager {
constructor() {
this.connections = {}; // 存储所有WebSocket连接
this.globalConnections = []; // 存储需要全局管理的连接名称
}
// 创建全局连接
createGlobalConnection(name, url, time, store) {
if (!this.connections[name]) {
this.connections[name] = new WebsocketUtil(url, time);
if (store) this.connections[name].setStore(store);
this.globalConnections.push(name);
}
return this.connections[name];
}
// 创建页面级连接
createPageConnection(name, url, time) {
if (!this.connections[name]) {
this.connections[name] = new WebsocketUtil(url, time);
}
return this.connections[name];
}
// 获取连接
getConnection(name) {
return this.connections[name];
}
// 关闭指定连接
closeConnection(name) {
console.log("关闭指定连接", name);
if (this.connections[name]) {
this.connections[name].close();
delete this.connections[name];
// 从全局连接列表中移除
this.globalConnections = this.globalConnections.filter((n) => n !== name);
}
}
// 关闭所有全局连接
closeAllGlobalConnections() {
this.globalConnections.forEach((name) => {
this.closeConnection(name);
});
}
// 关闭所有连接
closeAllConnections() {
Object.keys(this.connections).forEach((name) => {
this.connections[name].close();
});
this.connections = {};
this.globalConnections = [];
}
// 新增:判断指定名称的连接是否处于连接状态
isConnected(connectionName) {
// 获取指定名称的连接实例
const connection = this.connections[connectionName];
if (!connection) return false;
// 检查连接状态WebsocketUtil的is_open_socket为true且socketTask的readyState为1连接中
return connection.is_open_socket &&
connection.socketTask &&
connection.socketTask.readyState === 1;
}
}
// 导出单例实例
export const webSocketManager = new WebSocketManager();
export default WebsocketUtil;