项目实例 单例模式使用websoket 实用

在做项目的时候 使用到了单例模式的websoket感觉不错 推荐一下

项目用的是vue3+antdv 所以其中的提示使用的是ant-design-vue中的组件

import store from '@/store';
import notification from 'ant-design-vue/es/notification';
// import { getToken } from '@/utils/auth';
// import { ACCESS_TOKEN } from '@/store/mutation-types';

// 使用单例模式,创建WebSocket唯一实例
export default (function getWebSocket() {
  let $wsInstance = null;

  class MyWebSocket {
    constructor(url, initMessage) {
      this.url = url;
      this.start(initMessage);
    }

    start(initMessage) {
      if ('WebSocket' in window) {
        // 打开一个 web socket
        this.ws = new WebSocket(this.url);
        console.log(this.ws);
        this.ws.onopen = () => {
          if (initMessage) {
            this.sendMessage(initMessage);
          }
        };

        this.ws.onmessage = (mes) => {
          console.log(mes);
        };

        this.ws.onclose = () => {
          $wsInstance = null; // 销毁websockket实例
        };

        this.ws.onerror = () => {
          this.ws.close();
          $wsInstance = null; // 销毁websockket实例
          notification.error({
            message: '提示',
            description: '消息推送错误,请刷新浏览器重试!',
          });
        };
      } else {
        // 浏览器不支持 WebSocket
        notification.error({
          message: '提示',
          description: '您的浏览器不支持 WebSocket!',
        });
      }
    }

    sendMessage(message) {
      if ($wsInstance) {
        this.ws.send(message);
        console.log($wsInstance);
      } else {
        notification.error({
          message: '提示',
          description: '消息推送错误,请刷新浏览器重试!',
        });
      }
    }

    getWS() {
      return this.ws;
    }
  }
  // 返回的方法
  return function getWS(initMessage) {
    if (!$wsInstance) {
      const proto = window.location.protocol === 'http:' ? 'ws:' : 'wss:';
      const { userId } = store.state.user;
      const wsUrl = `${proto}//${window.location.host}/common/${userId}`;
      $wsInstance = new MyWebSocket(wsUrl, initMessage);
    } else {
      $wsInstance.sendMessage(initMessage);
    }
    return $wsInstance;
  };
}());

 使用时如下:

 

//引入
import getWebSocket from '@/webSocket';
const webSocket = ref();
//实例化
 webSocket.value = getWebSocket();
// webSocket接收数据
  webSocket.value.getWS().onmessage = (mes) => {
}
//发送数据
 webSocket.value.sendMessage(JSON.stringify(toRaw('数据')));

//关闭
 webSocket.value.getWS().close();

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue使用 WebSocket 需要进行如下步骤: 1. 安装 `websocket` 库 ```bash npm install websocket ``` 2. 封装 WebSocketVue 项目中,通常我们会将 WebSocket 封装成一个模块,方便其他组件调用。以下是一个示例: ```javascript import WebSocket from 'websocket'; class WebsocketClient { constructor(url) { this.url = url; this.client = null; this.connected = false; this.listeners = {}; this.connect(); } connect() { this.client = new WebSocket.client(); this.client.on('connect', () => { this.connected = true; this.emit('connect'); }); this.client.on('message', (message) => { this.emit('message', message); }); this.client.on('close', () => { this.connected = false; this.emit('close'); }); this.client.connect(this.url); } send(data) { if (this.connected) { this.client.send(JSON.stringify(data)); } } on(event, listener) { this.listeners[event] = this.listeners[event] || []; this.listeners[event].push(listener); } emit(event, ...args) { const listeners = this.listeners[event]; if (listeners) { listeners.forEach((listener) => { listener.apply(null, args); }); } } close() { this.client.close(); } } export default WebsocketClient; ``` 3. 在组件中使用 WebSocket 在需要使用 WebSocket 的组件中使用上面封装好的 WebSocket 模块。例如,在 `App.vue` 组件中使用: ```vue <template> <div class="app"> <h1>Hello, WebSocket!</h1> </div> </template> <script> import WebsocketClient from './websocket'; export default { name: 'App', created() { this.websocket = new WebsocketClient('ws://localhost:8080'); this.websocket.on('connect', () => { console.log('WebSocket connected!'); }); this.websocket.on('message', (message) => { console.log('WebSocket message received:', message); }); this.websocket.on('close', () => { console.log('WebSocket closed!'); }); }, beforeDestroy() { this.websocket.close(); }, }; </script> ``` 在上面的代码中,我们在 `created()` 生命周期中创建了一个 WebSocket 实例,并绑定了 `connect`、`message`、`close` 事件。在组件销毁之前,我们需要调用 `close()` 方法关闭 WebSocket 连接,防止内存泄漏。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫ゞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值