RuoYi-Cloud/ruoyi-ui/src/utils/socket-server.js

133 lines
3.6 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.

import { Message } from "element-ui";
import store from '@/store'
// let wsUrl = 'ws://127.0.0.1:9002/warning/api';
export default class SocketService {
/**
* 单例
*/
static instance = null;
static get Instance() {
if (!this.instance) {
this.instance = new SocketService();
}
return this.instance;
}
// 和服务端连接的socket对象
ws = null;
// 存储回调函数
callBackMapping = {};
// 标识是否连接成功
connected = false;
// 记录重试的次数
sendRetryCount = 0;
// 重新连接尝试的次数
connectRetryCount = 0;
// 是否手动关闭websocket连接
isManualClose = false
// 定义连接服务器的方法
connect() {
// 连接服务器
if (!window.WebSocket) {
return console.log("您的浏览器不支持WebSocket");
}
//网关转发
let wsUrl = 'ws://localhost:8080/warning/webSocket/warning/api';
wsUrl += `/${store.getters.name}`
this.ws = new WebSocket(wsUrl)
// 连接成功的事件
this.ws.onopen = () => {
this.connected = true;
// 重置重新连接的次数
this.connectRetryCount = 0;
};
// 1.连接服务端失败
// 2.当连接成功之后, 服务器关闭的情况
this.ws.onclose = (event) => {
// e.code === 1000 表示正常关闭。 无论为何目的而创建, 该链接都已成功完成任务。
// e.code !== 1000 表示非正常关闭。
console.log("onclose event: ", event);
this.connected = false;
if (event && event.code !== 1000) {
console.log("连接服务端失败");
// 如果不是手动关闭,这里的重连会执行;如果调用了手动关闭函数,这里重连不会执行
this.connectRetryCount++;
setTimeout(() => {
this.connect();
}, 500 * this.connectRetryCount);
}
};
// 得到服务端发送过来的数据
this.ws.onmessage = (msg) => {
// 真正服务端发送过来的原始数据时在msg中的data字段
const recvData = JSON.parse(msg.data);
console.log(recvData)
const socketType = recvData.socketType;
if (this.callBackMapping[socketType]){
this.callBackMapping[socketType].call(this, recvData);
}
};
}
// 回调函数的注册
registerCallBack(socketType, callBack) {
this.callBackMapping[socketType] = callBack;
}
// 取消某一个回调函数
unRegisterCallBack(socketType) {
this.callBackMapping[socketType] = null;
}
// 发送数据的方法
send(data) {
// 判断此时此刻有没有连接成功
if (this.connected) {
this.sendRetryCount = 0;
this.ws.send(JSON.stringify(data));
console.log('xxxxxxxxxxxx')
} else if (!this.isManualClose) {
console.log('=============')
this.sendRetryCount++;
setTimeout(() => {
this.send(data);
}, this.sendRetryCount * 500);
}
}
// 手动关闭websocket 这里手动关闭会执行onclose事件
closeWebsocket() {
if (this.ws) {
try {
this.ws.close(); // 关闭websocket
this.ws = null
this.callBackMapping = {}
this.connected = false
this.sendRetryCount = 0
this.connectRetryCount = 0
this.isManualClose = true
this.instance = null
SocketService.instance = null
} catch (error) {
console.log(error)
}
}
}
}
const MessageEvent = { // onmessage回调函数的event
data: { // websocket通讯接收到的数据
socketType: '', // websocket双方通讯的名称
data: {}, // 返回的真实数据
}
}