vue3+ts使用websocket 实现实时推送消息

因业务需要,做大屏页面某一处需要不断推送消息,采用websocket技术;

1. 新建socket.ts

在utils文件夹下新建socket.ts;

export default class Socket {
  // cb: 存储回调函数
  constructor(url: string, cb: (data: any) => void) {
    this.url = url;
    this.cb = cb;
    this.connect();
  }

  private readonly url: string = '';
  private cb?: (data: any) => void;
  // 和服务端连接的socket对象
  private ws?: WebSocket;
  private remainPayload: any[] = [];

  public connect() {
    return new Promise<void>(resolve => {
      const ws = new WebSocket(this.url);

      ws.onopen = e => {
        console.info('ws open 连接成功', e);
        this.remainPayload.forEach(payload => {
          ws.send(payload);
        });
        resolve();
      };

      // 得到服务端发送过来的数据
      ws.onmessage = e => {
        if (this.cb) {
          this.cb(e.data);
        }
      };

      ws.onerror = e => {
        console.error('ws error', e);
      };

      // ws.onclose = e => {
      //   console.info('ws close', e);
      // };
      this.ws = ws;
    });
  }

  public async send(payload: any) {
    if (!payload || !this.ws) {
      if (!this.ws) {
        this.remainPayload.push(JSON.stringify(payload));
      }
      return;
    }
    if (this.isConnected) {
      this.ws.send(JSON.stringify(payload));
    } else {
      // 后端主动断开 前端发起请求 需要在连接一次
      await this.connect();
      this.ws.send(JSON.stringify(payload));
    }
  }

  private get isConnected() {
    return this.ws && this.ws.readyState === WebSocket.OPEN;
  }

  public close() {
    if (this.ws) {
      this.ws.close();
      this.ws = undefined;
    }
  }
}

2. 新建websocket.ts

因为我使用pinia统一管理了一下 ,如果 不需要可以跳过这个步骤

import { defineStore } from 'pinia';
import Socket from '@/utils/socket';

const path = `ws://${window.location.host}${window.location.pathname}`;

interface WebSocketModel {
  message: string;
  exhibitWs: Socket | null;
}

export const useWebsocketStore = defineStore('websocket', {
  state: (): WebSocketModel => ({
    message: '',
    exhibitWs: null
  }),
  getters: {},
  actions: {
    initExhibitSocket() {
      const resp = new Socket(`${path}api/ws`, message => {
        this.message = JSON.parse(message);
      });
      this.exhibitWs = resp;
    }
  }
});

3. 定义api/ws的端口

在vite.confing.ts中

'/api/ws': {
        target: 'ws://192.168.2.68:8776',
        ws: false,
        changeOrigin: true
      }

4. 连接

我是在路由守卫中就连接使用 在route/index.ts中

router.beforeEach(to => {
  // 解决持久化失效问题
  const { websocket } = useStore();
  // 建立链接
  if (!websocket.exhibitWs) {
    websocket.initExhibitSocket();
  }
 。。。。
});
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对你的问题,我可以给你一些思路和建议: 1. 首先,你需要了解 WebSocket 协议的基本原理和使用方法。WebSocket 是一种基于 TCP 协议的双向通信协议,它可以在客户端和服务器之间建立长连接,实现实时通信。 2. 接下来,你需要在 Vue3 项目中安装 WebSocket 相关的库。常用的 WebSocket 库有 `socket.io-client`、`ws` 等,你可以根据自己的需求选择合适的库进行安装和使用。 3. 在 Vite 中使用 TypeScript 也是很简单的。你只需要在项目中安装 `typescript` 和 `@vitejs/plugin-vue`,然后配置 `tsconfig.json` 文件和 `vite.config.ts` 文件即可。 4. 在 Vue3 中使用 WebSocket 也很方便。你可以在组件中使用 `created()` 或 `mounted()` 钩子函数来创建 WebSocket 连接,并在 `beforeUnmount()` 钩子函数中关闭 WebSocket 连接。 下面是一个简单的示例代码,供你参考: ```typescript <template> <div> <p>{{ message }}</p> </div> </template> <script lang="ts"> import { defineComponent } from 'vue'; import io from 'socket.io-client'; export default defineComponent({ data() { return { message: '', }; }, mounted() { const socket = io('ws://localhost:3000'); socket.on('connect', () => { console.log('WebSocket Connected!'); }); socket.on('message', (data: string) => { this.message = data; }); }, beforeUnmount() { // 关闭 WebSocket 连接 socket.close(); }, }); </script> ``` 以上就是使用 Vue3 + Vite + TypeScript 实现 WebSocket 的基本思路和方法。希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值