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

yizhihongxing

一、背景

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日

相关文章

  • 学习ASP.NET Core Razor 编程系列八——并发处理

    下面是“学习ASP.NET Core Razor 编程系列八——并发处理的完整攻略”的详细讲解,包括并发处理的概念、解决方案和两个示例等方面。 并发处理的概念 并发处理是指在多个线程或进程同时执行的情况下,保证数据的一致性和正确性的处理方式。在ASP.NET Core Razor编程中,常见的并发处理场景包括多个用户同时访问同一个资源、多个线程同时修改同一个…

    other 2023年5月5日
    00
  • Linux上超酷的命令行扩展工具Oh My Zsh

    Oh My Zsh是一种命令行扩展工具,可用于美化和增强Linux终端环境,提供多个主题和插件。下面是详细讲解Oh My Zsh的完整攻略: 安装Oh My Zsh 首先需要先安装Zsh,可以使用以下命令在Ubuntu上进行安装: sudo apt-get install zsh 然后使用以下命令安装Oh My Zsh: sh -c "$(curl…

    other 2023年6月26日
    00
  • linux下删除乱码文件名的方法

    针对Linux下删除乱码文件名的方法,以下为详细攻略: 一、什么是乱码文件名 在Linux中,文件名通常是由ASCII字符集中的字母、数字、符号等组成的。但是当我们在Linux上遇到了乱码文件名,通常是因为文件名使用了非ASCII字符集中的字符,如中文、日文、韩文等。这些非ASCII的字符在Linux中可能会显示为乱码,特别是在系统环境配置不当或者终端软件不…

    other 2023年6月26日
    00
  • Android Tablayout 自定义Tab布局的使用案例

    Android Tablayout 自定义Tab布局的使用案例 Tablayout是Android Material Design库中的一部分,它提供了一个用于展示多个页面的标签栏,很多应用程序都使用它来实现这个功能。默认情况下,Tablayout会使用系统提供的样式来展示标签。但是有时候我们可能需要自定义Tab布局,来满足一些特殊的需求。 本文将介绍如何使…

    other 2023年6月25日
    00
  • Win11系统右键怎么新建txt文件?Win11系统新建txt文件方法

    Win11系统新增txt文件的方法非常简单,下面我将给出具体的攻略步骤,包括了两个示例说明。 方案一:使用鼠标右键操作 在桌面或者任意文件夹空白处单击鼠标右键,弹出快捷菜单。 在菜单中选择“新建” -> “文本文档”。 Windows会自动为文本文档命名为“新建文本文档.txt”,你可以通过重命名来修改其名称。 示例说明一:假设你需要在桌面新建一个名为…

    other 2023年6月27日
    00
  • linux学习日记十二 磁盘配额(quota)

    下面是《Linux学习日记十二 磁盘配额(quota)》的完整攻略。 什么是磁盘配额(quota) 磁盘配额(quota)是一种机制,它可以限制用户在文件系统中可以使用的空间大小,以避免磁盘被某个用户的文件占满。 配置磁盘配额 在Linux系统中,使用磁盘配额需要安装quota软件包。以Debian/Ubuntu系统为例,使用以下命令安装quota: sud…

    other 2023年6月28日
    00
  • java中3种将byte转换为string的方法

    以下是关于“Java中3种将byte转换为String的方法”的完整攻略: 1. 使用String构造函数 Java中的String类提供了一个构造函数,可以将byte数组转换为String。该构造函数的语法如下: String(byte[] bytes) 示例: byte[] bytes = {72, 101, 108, 108, 111, 32, 87,…

    other 2023年5月6日
    00
  • 详解Python中递归函数的原理与使用

    下面是详解Python中递归函数的原理与使用的完整攻略。 什么是递归函数 递归函数是指在函数中调用函数自身的一种编程技巧。在递归函数中,函数不断地调用自身,并且通过一定的逻辑条件来判断递归结束的条件,从而达到解决问题的目的。递归函数的实现可以让程序更加简洁高效,但同时也需要注意一些风险,比如可能因为递归层数过深导致栈溢出等问题。 递归函数的原理 递归函数的原…

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