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
相关推荐
烁月_o913 分钟前
《安全工程师自我防护指南:直面数字威胁的有效策略与实践》
运维·网络·经验分享·其他·网络安全
不一样的信息安全17 分钟前
网络安全与信息安全的区别
网络·网络安全·信息安全
听风吹等浪起41 分钟前
改进系列(6):基于DenseNet网络添加TripletAttention注意力层实现的番茄病害图像分类
网络·人工智能·神经网络·算法·分类
BBluster1 小时前
multiprocessing包详解【Python】
开发语言·网络·python
半个西瓜.1 小时前
网络安全:基线检查---自动化脚本检测.
网络·安全·web安全·网络安全·安全威胁分析
小马超会养兔子2 小时前
vue2实现答题组件
开发语言·前端·javascript·vue
运维小文2 小时前
TCP协议简单分析和握手挥手过程
服务器·网络·网络协议·tcp/ip·三次握手
xtggbmdk2 小时前
三层交换机和路由器的连接方式有三种:
网络·智能路由器
gywl2 小时前
计算机网络-应用层
服务器·网络·计算机网络
光明编码使者2 小时前
WebSocket 与 Server-Sent Events (SSE) 的对比与应用
网络·websocket·网络协议