123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- /* eslint-disable no-unused-vars */
- import { Message } from "element-ui";
- import { encryptDes, getUuid, sha1_to_base64 } from "./des.js";
- import { getToken, setToken } from "@/utils/auth";
- class socketClient {
- wsUrl = "";
- wsAuto = {};
- websocket = null;
- heartBeatTimer = null;
- lockReconnect = false;
- errTimer = null;
- isLoad = true;
- constructor(wsUrl, wsAuto) {
- this.wsUrl = wsUrl;
- this.wsAuto = wsAuto;
- }
- // 初始化socket
- initWebSocket () {
- return new Promise((resolve, reject) => {
- this.websocket = new WebSocket(this.wsUrl);
- this.wsOpen().then((res) => {
- this.isLoad = true;
- this.wsSend(this.wsAuto);
- this.lockReconnect = true;
- resolve(true)
- if (this.isLoad == true) {
- Message({
- message: "客户端连接成功",
- type: "success",
- duration: 5 * 1000,
- });
- }
- // this.heartBeat();
- });
- this.websocket.onerror = (evt) => {
- this.wsReconnect();
- };
- this.websocket.onclose = (evt) => {
- if (this.isLoad == true) {
- Message({
- message: "客户端断开连接",
- type: "error",
- center: true,
- duration: 5 * 1000,
- });
- }
- this.isLoad = false;
- this.lockReconnect = false;
- this.wsReconnect();
- };
- })
- }
- // 重新连接
- wsReconnect () {
- if (this.heartBeatTimer) clearInterval(this.heartBeatTimer);
- if (this.errTimer) clearTimeout(this.errTimer);
- if (this.lockReconnect) return;
- let that = this;
- this.errTimer = setTimeout(() => {
- that.initWebSocket();
- }, 1000);
- }
- heartBeat () {
- this.lockReconnect = false;
- if (this.heartBeatTimer) clearInterval(this.heartBeatTimer);
- const wsToken = getToken();
- // if (wsToken) {
- // this.heartBeatTimer = setInterval(() => {
- // const heatBeat = `{ MN: "Heart", Token: wsToken }`;
- // this.wsSend(heatBeat);
- // }, 20000);
- // }
- }
- // 打开连接
- wsOpen () {
- if (this.websocket) {
- return new Promise((resolve, reject) => {
- try {
- this.websocket.onopen = (evt) => {
- resolve(evt);
- };
- } catch (err) {
- this.$message.error('连接已经关闭,正在重新连接中...');
- reject(err);
- }
- });
- }
- }
- // 关闭连接
- wsClose () {
- if (this.websocket) {
- this.websocket.close();
- return new Promise((resolve, reject) => {
- try {
- this.websocket.onclose = (evt) => {
- this.$message.error('客户端断开连接');
- resolve(evt);
- };
- } catch (err) {
- reject(err);
- }
- });
- }
- }
- // 监听消息
- wsMessage (callback) {
- // 需要监听的消息路径
- if (this.websocket) {
- try {
- this.websocket.onmessage = (evt) => {
- // 判断是否有 data 数据
- if (evt.data) {
- let data = evt.data;
- if (this.isJsonString(data)) {
- callback(JSON.parse(data));
- }
- }
- };
- } catch (err) {
- callback(err);
- }
- }
- }
- // 发送消息
- wsSend (options, isFile = false) {
- if (this.websocket && this.websocket.readyState === 1) {
- try {
- if (isFile) {
- let params = { ...options };
- params.RequestId = getUuid();
- this.websocket.send(params);
- } else {
- this.websocket.send(JSON.stringify(options));
- }
- } catch (e) {
- Message({
- message: e.message,
- type: "error",
- duration: 5 * 1000,
- });
- }
- }
- }
- // 连接因错误而关闭时触发
- wsOnerror () {
- if (this.websocket) {
- return new Promise((resolve, reject) => {
- try {
- this.websocket.onerror = (evt) => {
- resolve(evt);
- };
- } catch (err) {
- reject(err);
- }
- });
- }
- }
- // 判断是否是json字符串
- isJsonString (str) {
- try {
- if (typeof JSON.parse(str) == "object") {
- return true;
- }
- } catch (e) {
- }
- return false;
- }
- }
- export { socketClient };
|