一文详解websocket在vue2中的封装使用

一、背景

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 协议在 2011 年被标准化为 RFC 6455,并已经被所有现代浏览器支持。Vue.js 是一款流行的前端框架,提供了便捷、高效的组件开发和渲染,可以方便地与 WebSocket 进行配合使用,实现实时推送、聊天室、直播等丰富的应用场景。

二、WebSocket 封装

在 vue2 中使用 WebSocket,最核心的是封装 WebSocket 构造函数,使其更加方便使用。以下是一个简单的 WebSocket 封装示例:

class WebSocketClient {
  constructor(url) {
    this._url = url;
    this._callbacks = {};
    this._reconnectTimer = null;
    this.init();
  }

  init() {
    this._ws = new WebSocket(this._url);
    this._ws.onopen = () => {
      this.onopen();
    };
    this._ws.onmessage = (e) => {
      this.onmessage(e);
    };
    this._ws.onclose = (e) => {
      this.onclose(e);
      // 尝试重连
      this.reconnect();
    }
  }

  onopen() {
    console.log('WebSocket open: ', this._url);
  }

  onmessage(e) {
    console.log('WebSocket message:', e.data);
    const data = JSON.parse(e.data);
    const type = data.type;
    if (type in this._callbacks) {
      this._callbacks[type](data);
    }
  }

  onclose(e) {
    console.log('WebSocket close:', e.reason);
  }

  reconnect() {
    clearTimeout(this._reconnectTimer);
    this._reconnectTimer = setTimeout(() => {
      console.log('WebSocket reconnect:', this._url);
      this.init();
    }, 5000);
  }

  send(data) {
    if (this._ws.readyState === WebSocket.OPEN) {
      this._ws.send(JSON.stringify(data));
    }
  }

  registerCallback(type, callback) {
    this._callbacks[type] = callback;
  }
}

该封装实现了以下功能:

  • WebSocket 的打开、消息、关闭事件的监听;
  • 支持 WebSocket 断开后尝试重连;
  • 结合 JSON.parse 和 JSON.stringify 实现消息体的编解码;
  • 支持注册消息类型回调函数。

三、在 Vue 中使用 WebSocket

通过上述 WebSocket 封装,我们可以方便地在 Vue 组件中使用。以下是一个示例:

<template>
  <div>
    <button @click="sendMsg">发送消息</button>
    <br>
    <input type="text" v-model="receivedMsg" disabled>
  </div>
</template>

<script>
import WebSocketClient from '@/utils/websocket';

export default {
  data() {
    return {
      ws: null,
      receivedMsg: '',
    };
  },
  created() {
    // 创建 WebSocket 客户端实例
    this.ws = new WebSocketClient('ws://localhost:8080');
    // 注册消息类型回调函数
    this.ws.registerCallback('message', (data) => {
      console.log('receivedMessage:', data);
      this.receivedMsg = data.message;
    });
  },
  methods: {
    sendMsg() {
      // 发送消息
      this.ws.send({
        type: 'message',
        message: 'Hello WebSocket!',
      });
    },
  },
};
</script>

该示例实现了以下功能:

  • 创建 WebSocket 实例并注册消息类型回调函数;
  • 在组件内发送消息;
  • 更新接收到的消息至组件数据模型。

四、进一步应用

使用 Vue 和 WebSocket,我们可以方便地实现各种应用场景。以下是两个进一步的应用示例:

实时统计

<template>
  <div>
    <table>
      <thead>
        <tr>
          <th>时间</th>
          <th>请求数</th>
          <th>响应时间</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="item in stats">
          <td>{{ item.time }}</td>
          <td>{{ item.requestCount }}</td>
          <td>{{ item.responseTime }}</td>
        </tr>
      </tbody>
    </table>
  </div>
</template>

<script>
import WebSocketClient from '@/utils/websocket';

export default {
  data() {
    return {
      ws: null,
      stats: [],
    };
  },
  created() {
    // 创建 WebSocket 客户端实例
    this.ws = new WebSocketClient('ws://localhost:8080/stats');
    // 注册消息类型回调函数
    this.ws.registerCallback('stats', (data) => {
      console.log('receivedStats:', data);
      this.stats.push(data);
      if (this.stats.length > 10) {
        this.stats.shift();
      }
    });
  },
};
</script>

该示例实现了一个实时统计页面,统计服务器在过去十秒内的请求数和响应时间,并将统计结果通过 WebSocket 推送实时展示至前端。其中,stats 数组维护了过去十秒内的统计结果,每次接收到新的统计结果时,将其添加至 stats,并截取前十个统计结果,用于展示。

聊天室

<template>
  <div>
    <div v-for="item in chatList">
      <strong>{{ item.user.name }}:</strong>{{ item.content }}
    </div>
    <form @submit.prevent="submit">
      <input type="text" placeholder="请输入内容" v-model="content">
      <button type="submit">发送</button>
    </form>
  </div>
</template>

<script>
import WebSocketClient from '@/utils/websocket';

export default {
  data() {
    return {
      ws: null,
      content: '',
      chatList: [],
    };
  },
  created() {
    // 创建 WebSocket 客户端实例
    this.ws = new WebSocketClient('ws://localhost:8080/chat');
    // 注册消息类型回调函数
    this.ws.registerCallback('chat', (data) => {
      console.log('receivedChat:', data);
      this.chatList.push(data);
    });
  },
  methods: {
    submit() {
      // 发送消息
      this.ws.send({
        type: 'chat',
        content: this.content,
      });
      this.content = '';
    },
  },
};
</script>

该示例实现了一个简单的聊天室,通过 WebSocket 实现实时推送。其中,chatList 数组维护了聊天记录,每次接收到新的聊天消息时,将其添加至 chatList,并实时渲染至页面。发送聊天消息时,将内容通过 WebSocket 发送至服务器。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文详解websocket在vue2中的封装使用 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • element-ui dialog弹窗增加全屏功能(推荐)

    Element-UI Dialog弹窗增加全屏功能攻略 Element-UI是一款基于Vue.js的组件库,提供了丰富的UI组件,其中包括Dialog弹窗组件。本攻略将详细讲解如何给Element-UI Dialog弹窗增加全屏功能。 步骤一:导入Element-UI和Vue.js 首先,确保你已经正确导入了Element-UI和Vue.js。你可以通过以下…

    other 2023年7月29日
    00
  • JavaScript实现多层颜色选项卡嵌套

    JavaScript实现多层颜色选项卡嵌套攻略 本攻略将详细介绍如何使用JavaScript实现多层颜色选项卡嵌套。选项卡是一种常见的用户界面元素,可以用于在不同的内容之间进行切换。多层颜色选项卡嵌套是指在一个选项卡中嵌套另一个选项卡,形成多层级的切换结构。 步骤1:HTML结构 首先,我们需要创建HTML结构来容纳选项卡。以下是一个简单的HTML结构示例:…

    other 2023年7月28日
    00
  • 荣耀50pro开发者选项如何开启?荣耀50pro打开开发者选项的方法

    荣耀50pro的开发者选项可以通过以下简单步骤来进行开启: 1. 打开“设置”应用 在荣耀50pro的主屏幕上,点击图标为“设置”的应用,打开设备的系统设置。 2. 进入设备信息页面 在“设置”应用主页中,向下滚动直至找到“关于手机”选项,点击进入。 3. 点击版本号 在“关于手机”页面中找到“版本号”选项,并持续点击此选项,直至屏幕上显示“您已成为开发者”…

    other 2023年6月26日
    00
  • hex文件解析

    Hex文件解析攻略 Hex文件是一种十六进制格式的文件,通常用于将二进制数据转换为可读的文本格式。在嵌入式系统中,Hex文件通常用于将程序代码和数据到微控制器中。本攻略将详细介绍Hex文件的结构和解析方法,并提供两个示例说明。 Hex文件结构 Hex文件由多个记录组成,每个记录包含以下字段: 起始符:一个冒号(:)字符。 字节数:一个表示中数据字节数的两位十…

    other 2023年5月8日
    00
  • android dialog自定义实例详解

    Android Dialog自定义实例详解 在Android应用程序中,我们通常需要使用Dialog来显示一些重要的提示信息或者需要让用户进行操作的界面。Android提供了一些默认的Dialog,例如AlertDialog、ProgressDialog等等,但是这些默认的Dialog不能够满足我们所有的需求,因此我们需要自定义Dialog。下面我们将详细介…

    other 2023年6月25日
    00
  • js通过var定义全局变量与在window对象上直接定义属性的区别说明

    当在JavaScript中定义全局变量时,有两种常见的方法:使用var关键字定义全局变量,或者直接在window对象上定义属性。下面是它们之间的区别说明: 作用域: 使用var关键字定义的全局变量具有函数作用域,而直接在window对象上定义的属性具有全局作用域。这意味着使用var定义的变量只在定义它的函数内部可见,而直接在window对象上定义的属性可以在…

    other 2023年7月28日
    00
  • 霍格沃茨之遗弹光敏警告时闪退怎么办 光敏警告闪退解决方法

    霍格沃茨之遗弹光敏警告时闪退怎么办 问题描述 在玩霍格沃茨之遗弹游戏时,当光敏警告出现时,游戏会出现闪退现象,导致无法正常游戏。该如何解决这个问题呢? 解决方法 1.禁用光敏警告 可以通过修改游戏配置文件来禁用光敏警告,从而避免游戏闪退。具体步骤如下: 找到游戏配置文件,通常在游戏安装目录下的 Config 文件夹中。 打开 Config 文件夹,找到并打开…

    other 2023年6月27日
    00
  • vue中的slot封装组件弹窗

    让我来详细讲解一下“Vue中的slot封装组件弹窗”的完整攻略。 什么是slot 在Vue中,slot是一种将内容分发到组件不同位置的技术。我们可以在组件内部定义 slot,然后在使用组件时将其填充。这样就可以将父组件中的内容传递到子组件中,并根据需要在子组件中放置。 slot的工作原理 slot的工作原理比较简单。在父组件中使用子组件时,可以在子组件的标签…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部