Explorar o código

websocket功能优化

zhangdaiscott %!s(int64=2) %!d(string=hai) anos
pai
achega
ef65bb830e
Modificáronse 1 ficheiros con 27 adicións e 38 borrados
  1. 27 38
      src/hooks/web/useWebSocket.ts

+ 27 - 38
src/hooks/web/useWebSocket.ts

@@ -1,17 +1,10 @@
 // noinspection JSUnusedGlobalSymbols
 
-import { computed, reactive, ref, unref } from 'vue';
-import { useWebSocket as $useWebSocket, WebSocketResult } from '@vueuse/core';
+import { unref } from 'vue';
+import { useWebSocket, WebSocketResult } from '@vueuse/core';
 import { getToken } from '/@/utils/auth';
 
-const state = reactive({
-  server: '',
-  sendValue: '',
-  recordList: [] as { id: number; time: number; res: string }[],
-});
-
-const result = ref<WebSocketResult<any>>();
-
+let result: WebSocketResult<any>;
 const listeners = new Map();
 
 /**
@@ -19,25 +12,28 @@ const listeners = new Map();
  * @param url
  */
 export function connectWebSocket(url: string) {
-  if (!unref(getIsOpen)) {
-    state.server = url;
-    //update-begin-author:taoyan date:2022-4-24 for: v2.4.6 的 websocket 服务端,存在性能和安全问题。 #3278
-    let token = (getToken() || '') as string;
-    result.value = $useWebSocket(state.server, {
-      // 自动重连
-      autoReconnect: true,
-      // 心跳检测
-      heartbeat: false,
-      protocols: [token],
-    });
-    //update-end-author:taoyan date:2022-4-24 for: v2.4.6 的 websocket 服务端,存在性能和安全问题。 #3278
-    
-    //【jeecgboot-vue3/issues/I5KULW】Websocket 连接后自动给关闭
-    //result.value.open();
-    const ws = unref(result.value.ws);
-    if (ws) {
-      ws.onopen = onOpen;
-      ws.onclose = onClose;
+  //update-begin-author:taoyan date:2022-4-24 for: v2.4.6 的 websocket 服务端,存在性能和安全问题。 #3278
+  let token = (getToken() || '') as string;
+  result = useWebSocket(url, {
+    // 自动重连 (遇到错误最多重复连接10次)
+    autoReconnect: {
+      retries : 10,
+      delay : 5000
+    },
+    // 心跳检测
+    heartbeat: {
+      message: "ping",
+      interval: 55000
+    },
+    protocols: [token],
+  });
+  //update-end-author:taoyan date:2022-4-24 for: v2.4.6 的 websocket 服务端,存在性能和安全问题。 #3278
+  if (result) {
+    result.open = onOpen;
+    result.close = onClose;
+
+    const ws = unref(result.ws);
+    if(ws!=null){
       ws.onerror = onError;
       ws.onmessage = onMessage;
     }
@@ -57,9 +53,6 @@ function onError(e) {
 }
 
 function onMessage(e) {
-  if (e.data === 'ping') {
-    return;
-  }
   console.debug('[WebSocket] -----接收消息-------', e.data);
   try {
     const data = JSON.parse(e.data);
@@ -75,10 +68,6 @@ function onMessage(e) {
   }
 }
 
-/**
- * 判断 WebSocket 是否是开启状态
- */
-export const getIsOpen = computed(() => result.value?.status.value === 'OPEN');
 
 /**
  * 添加 WebSocket 消息监听
@@ -103,6 +92,6 @@ export function offWebSocket(callback: (data: object) => any) {
   listeners.delete(callback);
 }
 
-export function useWebSocket() {
-  return unref(result);
+export function useMyWebSocket() {
+  return result;
 }