Vue封装websocket双向通讯

  1. 封装的socket.js文件内容:

    var websock = null;

    var global_callback = null;
    var serverPort = '80'; // webSocket连接端口
    var wsuri = 'wss://uat.sssyin.cn/ws-reservation';

    function createWebSocket(callback) {

    if (websock == null || typeof websock !== WebSocket) {
    initWebSocket(callback);
    }
    }

    function initWebSocket(callback) {
    global_callback = callback;
    // 初始化websocket
    websock = new WebSocket(wsuri);
    websock.onmessage = function (e) {
    websocketonmessage(e);
    };
    websock.onclose = function (e) {
    websocketclose(e);
    };
    websock.onopen = function () {
    websocketOpen();
    };

    // 连接发生错误的回调方法
    websock.onerror = function () {
    console.log('WebSocket连接发生错误');
    //createWebSocket();啊,发现这样写会创建多个连接,加延时也不行
    };
    }

    // 实际调用的方法
    function sendSock(agentData ) {

    if (websock.readyState === websock.OPEN) {
    // 若是ws开启状态
    websocketsend(agentData);
    } else if (websock.readyState === websock.CONNECTING) {
    // 若是 正在开启状态,则等待1s后重新调用
    setTimeout(function () {
    sendSock(agentData);
    }, 1000);
    } else {
    // 若未开启 ,则等待1s后重新调用
    setTimeout(function () {
    sendSock(agentData);
    }, 1000);
    }
    }

    function closeSock() {
    websock.close();
    }

    // 数据接收
    function websocketonmessage(msg) {
    // console.log("收到数据:"+JSON.parse(e.data));
    // console.log("收到数据:"+msg);

    // global_callback(JSON.parse(msg.data));

    // 收到信息为Blob类型时
    let result = null;
    // debugger
    if (msg.data instanceof Blob) {
    const reader = new FileReader();
    reader.readAsText(msg.data, 'UTF-8');
    reader.onload = e => {
    result = JSON.parse(reader.result);
    //console.log("websocket收到", result);
    global_callback(result);
    };
    } else {
    result = JSON.parse(msg.data);
    //console.log("websocket收到", result);
    global_callback(result);
    }
    }

    // 数据发送
    function websocketsend(agentData) {
    console.log(发送数据:${ agentData });
    websock.send(agentData);
    }

    // 关闭
    function websocketclose(e) {
    console.log(connection closed (${ e.code }));
    }

    function websocketOpen(e) {
    console.log('连接打开');
    }

    export { sendSock, createWebSocket, closeSock };

2、页面调用

复制代码
<template>
  <div>
    <button>发消息</button>
  </div>
</template>

<script>
import { sendSock, createWebSocket, closeSock } from './sockt.js';

export default {
  data () {
    return {

    }
  },
  created() {
    this.init();
  },
  destroyed(){
    closeSock();
  },
  methods: {
    init() {
      createWebSocket(this.global_callback);

    },
    send(){
      var sendData = {
        operate:'singleChannelSwitch',
        index:index+1,
        opera:row.button_relay
      };
      sendSock(1111);
    },
    // websocket的回调函数,msg表示收到的消息
    global_callback(msg) {
      console.log(`websocket的回调函数收到服务器信息:${ JSON.stringify(msg) }`);
      // console.log("收到服务器信息:" + msg);
    },
  }
}
</script>

<style>

</style>
相关推荐
幽络源小助理1 分钟前
IP定位系统源码二开版 新增分销功能 PHP地理位置查询系统
前端·开源·源码·php源码
JianZhen✓1 分钟前
前端面试“八股文” - 核心、高频知识体系整理
前端·ai编程
sheeta19981 分钟前
Pinia核心笔记
前端·vue.js·笔记
淑子啦6 分钟前
TS 和组件绑定深耕(泛型表格)
前端·javascript·react.js
道清茗1 小时前
【shell编程知识点汇总】第九章 HTML 清洗、多行合并与条件替换
前端·html
噢,我明白了2 小时前
表单的完整 CRUD 练习【极简个人记账本】(含前端后端链接mySQL)
java·前端·数据库·mysql
幽络源小助理2 小时前
MacCMSPro版视频影视系统源码_全开源高可用视频平台解决方案
前端·php·php源码
不会敲代码19 小时前
手写 Zustand:三十分钟带你搞懂状态管理库的核心原理
前端·javascript·源码
神奇的程序员9 小时前
重构了自己5年前写的截图插件
前端·javascript·架构
晓杰'9 小时前
从0到1实现 Balatro 游戏后端(2):NestJS框架搭建与项目结构设计
后端·websocket·typescript·node.js·游戏开发·项目实战·nestjs