123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- import useUserStore from '@/store/modules/user';
- import { getToken } from '@/utils/auth';
- let webSock = null;
- let connectState = false; // 标记 WebSocket 连接状态
- let rec; //断线重连后,延迟5秒重新创建WebSocket连接 rec用来存储延迟请求的代码
- let closeFlag = false; // 是否关闭socket
- let global_callback = null;
- const port = '9988'; // webSocket连接端口
- const useUser = useUserStore();
- const wsUrl = `${import.meta.env.VITE_APP_BASE_WEBSOCKET}/api/pattern/1/ws`;
- function createWebSocket(callback) {
- if (webSock != null) {
- return;
- }
- webSock = new WebSocket(wsUrl);
- global_callback = callback;
- webSock.onopen = function () {
- // 连接打开时的处理
- websocketOpen();
- };
- webSock.onmessage = function (e) {
- // 接收消息时的处理
- websocketOnMessage(e);
- };
- webSock.onclose = function (e) {
- // 连接关闭时的处理
- websocketClose(e);
- };
- // 连接发生错误的回调方法
- webSock.onerror = function () {
- websocketError();
- };
- }
- //心跳设置
- const heartCheck = {
- timeout: 30000, //每段时间发送一次心跳包 这里设置为20s
- timeoutObj: null, //延时发送消息对象(启动心跳新建这个对象,收到消息后重置对象)
- start: function () {
- this.timeoutObj = setInterval(function () {
- if (connectState) webSock.send(JSON.stringify({ type: 0 }));
- }, this.timeout);
- },
- reset: function () {
- clearTimeout(this.timeoutObj);
- this.start();
- }
- };
- //定义重连函数
- const reConnect = () => {
- console.log('尝试重新连接');
- if (connectState) return; //如果已经连上就不在重连了
- rec && clearTimeout(rec);
- rec = setTimeout(function () {
- // 延迟5秒重连 避免过多次过频繁请求重连
- if (!connectState) {
- createWebSocket();
- }
- }, 5000);
- };
- // 实际调用的方法
- function sendSock(agentData) {
- if (webSock.readyState === webSock.OPEN) {
- // 若是ws开启状态
- webSock.send(agentData);
- } else if (webSock.readyState === webSock.CONNECTING) {
- // 若是 正在开启状态,则等待1s后重新调用
- setTimeout(function () {
- sendSock(agentData);
- }, 1000);
- } else {
- // 若未开启 ,则等待1s后重新调用
- setTimeout(function () {
- sendSock(agentData);
- }, 1000);
- }
- }
- function websocketClose() {
- connectState = false;
- webSock = null;
- global_callback = null;
- closeFlag = false;
- heartCheck.timeoutObj && clearTimeout(heartCheck.timeoutObj);
- // 清除重连定时器
- rec && clearTimeout(rec);
- }
- // 数据接收
- function websocketOnMessage(msg) {
- if (!msg || !msg.data) {
- // 可能得情况 - 心跳机制、无关信息接收
- console.log('收到数据:空消息');
- return;
- }
- console.log(msg);
- // 收到信息为Blob类型时
- const result = JSON.parse(msg.data);
- if (result.type === 0 || result.type === '0') {
- //自己的业务
- } else {
- global_callback(result);
- }
- }
- function closeSock({ activeClose = false }) {
- closeFlag = activeClose;
- // 清除心跳定时器
- heartCheck.timeoutObj && clearTimeout(heartCheck.timeoutObj);
- // 清除重连定时器
- rec && clearTimeout(rec);
- if (closeFlag) {
- // 关闭socket
- webSock.close();
- }
- // 初始化相关变量
- webSock = null;
- connectState = false;
- }
- const websocketError = () => {
- closeSock({ activeClose: true });
- // 执行重连
- reConnect();
- };
- function websocketOpen() {
- webSock.send('Authorization: Bearer ' + getToken());
- connectState = true;
- heartCheck.start(); //发送心跳 看个人项目需求
- }
- export { sendSock, createWebSocket, closeSock };
|