首页 > 其他分享 >vite项目使用websocket通讯封装

vite项目使用websocket通讯封装

时间:2024-03-05 11:47:02浏览次数:20  
标签:WebSocket socket console log eventData 封装 websocket vite const

项目使用vue3 + pinia

import { defineStore } from 'pinia';
import { getCurrentInstance } from 'vue';

export const useSocketStore = defineStore('socket', () => {
  const { proxy } = getCurrentInstance();
  const wsUrl = proxy.$wsUrl;
  let socket = null;
  let isConnected = false;
  let messageCallback = null; // 存储消息回调函数

  function connectSocket() {
    if (!isConnected) {
      socket = new WebSocket(wsUrl);
      // 连接建立
      socket.addEventListener('open', async () => {
        console.log('WebSocket 连接已建立');
        isConnected = true;
        if (isConnected) {
          proxy.submitOk('WebSocket 连接已建立!');
        }
      });

      // 连接错误
      socket.addEventListener('error', (event) => {
        console.error('WebSocket 错误:', event);
        proxy.submitFail('WebSocket 连接错误!');
      });

      // 连接关闭
      socket.addEventListener('close', () => {
        console.log('WebSocket 连接已关闭');
        isConnected = false;
      });

      // 监听消息
      socket.addEventListener('message', (event) => {
        console.log('收到 WebSocket 消息:', event.data);
        const eventData = JSON.parse(event.data);
        // const eventData = event.data;
        console.log('解析获取之后的值:', eventData);
        // 调用消息回调函数,并传递消息数据\
        if (messageCallback) {
          // 调用消息回调函数,并传递消息数据
          messageCallback(eventData);
        }
      });
    } else {
      console.log('WebSocket 已连接,无需重新连接');
    }
  }

  // 设置消息回调函数
  // 设置消息回调函数并返回 Promise
  function getMessage(callback) {
    messageCallback = callback;
  }
  // 发送消息
  function sendMessage(command, type, payload) {
    const data = {
      command: command,
      type: type,
      payload: JSON.stringify(payload) || JSON.stringify({}),
    };
    console.log('发送消息:', data);
    socket.send(JSON.stringify(data));
  }

  return {
    connectSocket,
    getMessage,
    sendMessage,
  };
});

vue 页面使用,省略其他代码

const { connectSocket, getMessage, sendMessage } = proxy.$store.socket.useSocketStore();

function handleLogin() {
  // 建立链接
  connectSocket();
  setTimeout(() => {
    proxy.$refs.loginFormRef.validate((valid) => {
      if (valid) {
        sendMessage('User', 'User_Login', {
          name: loginForm.username,
          pwd: loginForm.password,
        })
        // 获取消息
        getMessage((eventData) => {
          console.log(eventData)
          handleLoginCommand(eventData)
        });
      }
    });
  }, 1000)
}

标签:WebSocket,socket,console,log,eventData,封装,websocket,vite,const
From: https://www.cnblogs.com/brujie/p/18053643

相关文章

  • GBU808-ASEMI整流桥GBU808参数、封装、尺寸
    编辑:llGBU808-ASEMI整流桥GBU808参数、封装、尺寸型号:GBU808品牌:ASEMI封装:GBU-4最大重复峰值反向电压:800V最大正向平均整流电流(Vdss):8A功率(Pd):中小功率芯片个数:4引脚数量:4类型:插件、整流桥正向浪涌电流:200A正向电压:1.10V最大输出电压(RMS):封装尺寸:如图工作温度:-55......
  • JAVA面向对象基础:封装,实体JavaBean
     封装: 封装设计对象规范:合理隐藏,合理暴露 即类中使用的public与private关键字合理使用(只暴露对对象数据操作的方法,不暴露数据,故在对象中用private来封装数据,用public来封装方法)将成员变量保护起来,将get与set方法暴露出来供相关操作。将需要外界访问的成员方法用public,不......
  • vite+vue3 遇到报错 Uncaught SyntaxError: Cannot use import statement outside a m
    按照报错找到了对应的位置import{createApp}from'/node_modules/.vite/deps/vue.js?v=d0a669cf'importAppfrom'/src/pages/project1/App.vue'//import'./index.css'//importrouterfrom"./router"//createApp(App).mount(&#......
  • 简单封装 Flurl
    FlurlHttpClient类publicclassFlurlHttpClient{privatereadonlyFlurlClientclient;publicFlurlHttpClient(FlurlClientclient){this.client=client;client.WithHeader("hteder","hhhhh");//请求头}......
  • vue3+vite,封装 echarts 组件以及如何使用
    1.封装echarts组件1.安装echarts所需npm包,如下。[email protected]@3.1.0//社区图等npmi@vueuse/[email protected]//一些好用的hook2.封装echarts组件1.在component目录下新建Echarts文件夹2.在Echarts文件夹下新建config文件夹(......
  • MDS300-16-ASEMI整流模块MDS300-16参数、封装、尺寸
    编辑:llMDS300-16-ASEMI整流模块MDS300-16参数、封装、尺寸型号:MDS300-16品牌:ASEMI封装:M25最大重复峰值反向电压:1600V最大正向平均整流电流(Vdss):300A功率(Pd):大功率芯片个数:6引脚数量:5类型:模块、大功率正向浪涌电流:500A正向电压:1.35V最大输出电压(RMS):封装尺寸:如图工......
  • useModal对弹窗进行逻辑封装
    useModal.jsimport{nextTick,ref}from'vue'import{isFunction}from'@/utils/judge'exportfunctionuseModal(){ //标题 //执行ok、cancel方法 constvisible=ref(false) constloading=ref(false) consthideModal=()=>{ ......
  • vue3 echart组件封装
    项目中用到了很多echart图表,进行了简单的组件封装,主要包含以下功能:创建图表实例,渲染图表支持传入自定义函数,可拿到图表实例,实现个性化功能支持配置更新后图表自动刷新,可配置是清空后再刷新loading状态控制resize时图表更新支持饼图默认高亮功能实现资源引入echart资源......
  • IIS配置Websocket
    前言作为新手小白最近有项目用了websocket,发布到iis后用其他设备连接不到,网上查询了一下,需要配置一下,记录下配置方法,防止忘记在控制面板/程序中打开启用或关闭windows功能2.启用websocket协议3.打开iis中的配置编辑器4.选择system.webserver/websocket节点......
  • 需要在本地实现一个聊天室,多个tab页相互通信,不能用websocket,你会怎么做?
    可以考虑使用以下方法:使用LocalStorage:这个存储API可在浏览器的不同标签页之间共享数据。当一个标签页发送消息时,将消息存储在LocalStorage中。其他标签页可以监听该存储区的变化,并读取最新的消息内容来实现通信效果。//监听变化2window.addEventListener("storage",(e)=>......