websocket封装及在父组件中的详细用法实例

这篇具有很好参考价值的文章主要介绍了websocket封装及在父组件中的详细用法实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

//————————————————websocket组件——————————————

<template>

  <div></div>

</template>

<script setup lang="ts" name="websocket-tool">

const emit = defineEmits(["getWSmsg"]);

const props = defineProps({

  uri: {

    type: String,

  },

});

const state = reactive({

  webSocket: ref(), // webSocket实例

  lockReconnect: false, // 重连锁,避免多次重连

  maxReconnect: x, // 最大重连次数, -1 标识无限重连

  reconnectTime: x, // 重连尝试次数

  heartbeat: {

    interval: x* 1000, // 心跳间隔时间  x秒

    timeout:  x* 1000, // 响应超时时间  x秒

    pingTimeoutObj: ref(), // 延时发送心跳的定时器

    pongTimeoutObj: ref(), // 接收心跳响应的定时器

    pingMessage: JSON.stringify({ type: "ping" }), // 心跳请求信息

  },

});

//获取token

const token =-------

//页面加载完初始化websocket

onMounted(() => {

  initWebSocket();

});

//页面跳转关闭websocket连接

onUnmounted(() => {

  state.webSocket.close();

  clearTimeoutObj(state.heartbeat);

});

const initWebSocket = () => {

  let host = 连接的后端地址.replace(/^http:\/\//, "");

  let wsUri = `ws://${host}${props.uri}?access_token=${token.value}  //拼接ws连接地址

  // 建立连接

  state.webSocket = new WebSocket(wsUri);

  // 连接成功

  state.webSocket.onopen = onOpen;

  // 连接错误

  state.webSocket.onerror = onError;

  // 接收信息

  state.webSocket.onmessage = onMessage;

  // 连接关闭

  state.webSocket.onclose = onClose;

};文章来源地址https://www.toymoban.com/news/detail-773251.html

const reconnect = () => {

  if (!token) {

    return;

  }

  if (

    state.lockReconnect ||

    (state.maxReconnect !== -1 && state.reconnectTime > state.maxReconnect)

  ) {

    return;

  }

  state.lockReconnect = true;

  setTimeout(() => {

    state.reconnectTime++;

    // 建立新连接

    initWebSocket();

    state.lockReconnect = false;

  }, 5000);

};

//清空定时器

const clearTimeoutObj = (heartbeat: any) => {

  heartbeat.pingTimeoutObj && clearTimeout(heartbeat.pingTimeoutObj);

  heartbeat.pongTimeoutObj && clearTimeout(heartbeat.pongTimeoutObj);

};

//开启心跳

const startHeartbeat = () => {

  const webSocket = state.webSocket;

  const heartbeat = state.heartbeat;

  // 清空定时器

  clearTimeoutObj(heartbeat);

  // 延时发送下一次心跳

  heartbeat.pingTimeoutObj = setTimeout(() => {

    // 如果连接正常

    if (webSocket.readyState === 1) {

      //这里发送一个心跳,后端收到后,返回一个心跳消息,

      webSocket.send(heartbeat.pingMessage);

      // 心跳发送后,如果服务器超时未响应则断开,如果响应了会被重置心跳定时器

      heartbeat.pongTimeoutObj = setTimeout(() => {

        webSocket.close();

      }, heartbeat.timeout);

    } else {

      // 否则重连

      reconnect();

    }

  }, heartbeat.interval);

};

//连接成功事件

const onOpen = () => {

  //开启心跳

  startHeartbeat();

  state.reconnectTime = 0;

};

//连接失败

const onError = () => {

  reconnect();    //重连

};

//连接关闭事件

const onClose = () => {

  reconnect();  //重连

};

//接收服务器推送过来的信息

const onMessage = (msg: any) => {

  startHeartbeat();   //收到服务器信息,心跳重置并发送

  if (msg.data.indexOf("pong") > 0) {

    return;

  }

  emit("getWSmsg", msg.data);

};

</script>

//————————————父组件中的使用方法——————————————
  <websocket-tool uri="XXX(和后端对接想要的ws地址)"  @getWSmsg="getWSmsg" /> 

const getWSmsg= (msg: any) => {

console.log("websocket推送的消息:",msg)

};

到了这里,关于websocket封装及在父组件中的详细用法实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • axios封装以及详细用法

    axios官网 下载文件时 在前端项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中。他有很多优秀的特性,例如拦截请求和响应、取消请求、转换json、客户端防御XSRF等。所以我们的尤大大也是果断放弃了对其官方

    2024年02月07日
    浏览(37)
  • 客户端 WebSocket详细用法

    WebSocket是一种网络通信协议,很多高级功能都需要用到它。 有些人会想,既然我们已经有了HTTP协议了,为什么还要花时间学另一种协议呢?这个协议到底有什么魔力,值得我们花时间学它。 因为 HTTP 协议有一个缺陷:通信只能由客户端发起。只能是客户端向服务器发出请求

    2024年02月04日
    浏览(45)
  • thinkphp结合WebSocket 实时推送消息详细实例

    实时推送消息是现代 Web 应用程序中常见的一种需求,而 WebSocket 已成为实时通信的首选技术。ThinkPHP 提供了对 WebSocket 的支持,本文将演示如何使用 ThinkPHP 实现 WebSocket 实时推送消息的详细例子。 安装 Swoole 在开始之前,你需要先安装 Swoole 扩展。可以使用以下命令来安装:

    2024年03月20日
    浏览(53)
  • unity C#中的封装、继承和多态简单易懂的经典实例

    C#中的封装、继承和多态是面向对象编程(OOP)的三大核心特性。下面分别对这三个概念进行深入解释,并通过实例来说明它们在实际开发中的应用。 封装 (Encapsulation) 实例1: 在这个例子中, BankAccount 类封装了账户余额(balance),外部不能直接修改它,只能通过 Deposit 和

    2024年02月22日
    浏览(49)
  • ue4 unreal Instanced Static Mesh Component 实例化静态网格体组件 的用法及意义

    注意这是个组件  ​​  这个组件的意义 本来在建模软件里面就有这个功能 用来应对大量,同样网格,同样材质,不同几何信息(位置 旋转 缩放)的网格 比如场景里面的垃圾桶 电线杆 路灯等几百上千的东西  我试过一两万挺轻松的... 比较骚的操作是可以更新几何信息,

    2024年02月09日
    浏览(65)
  • 解析CSS中的new Color(200, 200, 200, 100) 参数用法及应用实例

            在前端开发中,颜色是一个至关重要的视觉元素,而在JavaScript和Web开发中创建和操作颜色时,我们经常需要用到 Color 对象。例如, new Color(200, 200, 200, 100) 就是一种表示颜色的方式,它来源于HTML5的Canvas API或者一些JavaScript库如jQuery UI等。这个构造函数接收四个参

    2024年04月22日
    浏览(39)
  • pcie 的bdf 详细介绍,及用法实例、linux 查看pci设备信息命令详解

    PCIe是指PCI Express,是一种计算机总线标准。在PCIe中,每个连接到主板上的设备都有唯一的地址,被称为BDF。 BDF:Bus、Device、Function 的缩写。其中Bus是指PCIe总线编号(一个系统中可能存在多个PCIe总线),Device是指连接到该总线上的某个设备编号,Function是指同一个设备上不同

    2024年02月16日
    浏览(35)
  • element ui 表格组件与分页组件的二次封装 【扩展】vue中的render函数

    目录 效果图  组件封装  parseTime函数 debounce 函数 render通用渲染模版 页面使用 【扩展】vue 函数式组件 函数式组件特点: 函数式组件的优点: 【扩展】vue中的render函数 一、初步认识render函数 二、为什么使用render函数 三、render函数的解析 【扩展】添加操作栏显示权限 结构

    2024年02月09日
    浏览(83)
  • C++中的vector的详细用法

    目录 C++中的vector的详细用法 一、vector的介绍 二、存储类型 三、函数 四、vector二维数组两种方法 五、vector中find()用法 六、vector的访问 七、vector中insert()函数增加元素操作 八、vector中erase()函数删除元素操作 头文件:#include vector 向量(Vector)是一个封装了动态大小数组的顺

    2024年02月06日
    浏览(43)
  • Vue2自己封装的基础组件库或基于Element-ui再次封装的基础组件库,如何发布到npm并使用(支持全局或按需引入使用),超详细

    以下我以 wocwin-admin-vue2 项目为例 修改目录结构,最终如下 1、导入组件,组件必须声明 name 2、定义 install 方法,接收 Vue 作为参数。如果使用 use 注册插件,则所有的组件都将被注册 3、导出的对象必须具有 install,才能被 Vue.use() 方法安装(全局使用) 4、按需引入 5、packa

    2024年02月08日
    浏览(82)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包