websocket 服务 pinia 全局配置

websocket 方法类

javascript 复制代码
// stores/webSocketStore.ts
import { defineStore } from "pinia";

interface WebSocketStoreState {
  ws: WebSocket | null; // WebSocket 实例
  callbacks: ((message: string) => void)[]; // 消息回调函数列表
  connected: boolean; // 连接状态
}

export const useWebSocketStore = defineStore("webSocket", {
  state: (): WebSocketStoreState => ({
    ws: null,
    callbacks: [],
    connected: false,
  }),

  actions: {
    // 连接 WebSocket
    connect(url: string): void {
      if (this.ws) {
        console.warn("WebSocket already connected");
        return;
      }

      // 创建 WebSocket 实例
      this.ws = new WebSocket(url);

      // 监听连接打开事件
      this.ws.onopen = () => {
        console.log("WebSocket connected");
        this.connected = true;
      };

      // 监听消息事件
      this.ws.onmessage = (event: MessageEvent) => {
        // console.log("Received message:", event.data);
        this.callbacks.forEach((callback) => callback(event.data)); // 执行回调
      };

      // 监听错误事件
      this.ws.onerror = (error) => {
        console.error("WebSocket error:", error);
      };

      // 监听连接关闭事件
      this.ws.onclose = () => {
        console.log("WebSocket connection closed");
        this.connected = false;
      };
    },

    // 发送消息
    send(message: string): void {
      if (this.ws && this.ws.readyState === WebSocket.OPEN) {
        this.ws.send(message);
      } else {
        console.error("WebSocket is not open");
      }
    },

    // 注册接收消息的回调函数
    onMessage(callback: (message: string) => void): void {
      this.callbacks.push(callback);
    },

    // 重新连接 WebSocket
    reconnect(url: string): void {
      if (url) {
        console.log("Reconnecting WebSocket...");
        // 创建 WebSocket 实例
        this.ws = new WebSocket(url);

        // 监听连接打开事件
        this.ws.onopen = () => {
          console.log("WebSocket connected");
          this.connected = true;
        };

        // 监听消息事件
        this.ws.onmessage = (event: MessageEvent) => {
          // console.log("Received message:", event.data);
          this.callbacks.forEach((callback) => callback(event.data)); // 执行回调
        };

        // 监听错误事件
        this.ws.onerror = (error) => {
          console.error("WebSocket error:", error);
        };

        // 监听连接关闭事件
        this.ws.onclose = () => {
          console.log("WebSocket connection closed");
          this.connected = false;
        };
      } else {
        console.error("No URL available to reconnect");
      }
    },

    // 关闭 WebSocket 连接
    close(): void {
      if (this.ws) {
        this.ws.close();
      }
    },
  },
});

页面中使用例子

javascript 复制代码
<template>
  <div>
    <el-button @click="connectWebSocket">Connect WebSocket</el-button>
    <el-button @click="sendMessage">Send Message</el-button>
    <el-button @click="closeWebSocket">Close WebSocket</el-button>
    <el-button @click="reconnect('ws://localhost:3030')"
      >Reset Connection</el-button
    >

    <div v-if="webSocketStore.connected">WebSocket is connected</div>
    <div v-else>WebSocket is disconnected</div>
  </div>
</template>

<script lang="ts">
import { defineComponent } from "vue";
import { useWebSocketStore } from "@/store/webSocketStore"; // 根据实际路径调整

export default defineComponent({
  setup() {
    // 获取 Pinia store
    const webSocketStore = useWebSocketStore();

    // 连接 WebSocket
    const connectWebSocket = () => {
      const url = "ws://localhost:3030"; // 替换为实际的 WebSocket URL
      debugger;
      if (!webSocketStore.connected) {
        webSocketStore.connect(url);
      }
      // if (webSocketStore.ws?.readyState != 1) {
      //   webSocketStore.ws?.onopen;
      // }
    };

    // 发送消息
    const sendMessage = () => {
      const message = "Hello, WebSocket!";
      webSocketStore.send(message);
    };

    // 关闭 WebSocket
    const closeWebSocket = () => {
      webSocketStore.close();
    };

    const reconnect = (url: string) => {
      webSocketStore.reconnect(url);
    };

    // 注册接收到消息的回调函数
    webSocketStore.onMessage((message) => {
      console.log("Received message in component:", message);
    });

    return {
      connectWebSocket,
      sendMessage,
      closeWebSocket,
      reconnect,
      webSocketStore,
      connected: webSocketStore.connected, // 从 store 中获取连接状态
    };
  },
});
</script>

websocket 服务端 测试实例

1.项目中安装 websocket 模块
javascript 复制代码
npm install ws
2.添加如下服务代码
javascript 复制代码
// 导入必要的模块
const express = require('express');
const http = require('http');
const WebSocket = require('ws');

// 创建一个 Express 应用
const app = express();

// 创建一个 HTTP 服务器
const server = http.createServer(app);

// 创建 WebSocket 服务器,传入 HTTP 服务器对象
const wss = new WebSocket.Server({ server });

// WebSocket 连接事件处理
wss.on('connection', (ws) => {
  console.log('A new client connected.');

  // 监听客户端发送的消息
  ws.on('message', (message) => {
    console.log(`Received message: ${message}`);
    
    // 发送消息回客户端
    ws.send(`${message}`);
  });

  // 连接关闭时的处理
  ws.on('close', () => {
    console.log('Client disconnected.');
  });


      const jsonData = {
         SendName: "server",
          ReceiveName: "connectionning client",
          SendDataInfo: { msg: "welcome connection success", type: "tips" },
	  };

        const plainData = { ...jsonData };


  // 发送欢迎消息给客户端
  ws.send(JSON.stringify(plainData));
});

// 设置一个基本的 HTTP 路由
app.get('/', (req, res) => {
  res.send('Hello, Node.js with WebSocket!');
});

// 设置端口并启动服务器
const PORT = process.env.PORT || 3030;
server.listen(PORT, () => {
  console.log(`Server running on http://localhost:${PORT}`);
});
3. 启动websocket 测试服务端
javascript 复制代码
node server.js
相关推荐
换个昵称都难1 小时前
webrtc 音频模块FEC模块
网络·音视频·webrtc
youngerwang1 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
zjun10012 小时前
TCP专栏-4.四次挥手
网络协议·tcp/ip
天天进步20153 小时前
Tunnelto 源码解析 #9:控制服务器设计:Warp、WebSocket、Ping/Pong 与连接保活
运维·服务器·websocket
智慧光迅AINOPOL4 小时前
校园在线巡课系统方案:督导全覆盖
网络·全光网解决方案·全光网·校园全光网·校园全光网解决方案
酉鬼女又兒4 小时前
零基础入门计算机网络:网络层核心任务、三大关键问题、两种服务类型与 TCP/IP 网际层协议体系全解析
服务器·网络·网络协议·tcp/ip·计算机网络·php·求职招聘
Urbano5 小时前
工装制作全流程科普:从面料到自动化生产
网络·人工智能
2401_868534785 小时前
网规笔记 | 真题解析:2018年11月软考网规-网络安全案例分析
网络
医疗信息化王工5 小时前
医院自律端系统——预警处置模块全栈实战(ASP.NET Core + Vue3 + Quartz 定时调度)
mysql·postgresql·vue·asp.net core·quartz
Gauss松鼠会5 小时前
【GaussDB】GaussDB重要通信参数汇总
服务器·网络·数据库·sql·性能优化·gaussdb·经验总结