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>
相关推荐
m0_7482309412 分钟前
Rust赋能前端: 纯血前端将 Table 导出 Excel
前端·rust·excel
qq_5895681020 分钟前
Echarts的高级使用,动画,交互api
前端·javascript·echarts
黑客老陈1 小时前
新手小白如何挖掘cnvd通用漏洞之存储xss漏洞(利用xss钓鱼)
运维·服务器·前端·网络·安全·web3·xss
正小安1 小时前
Vite系列课程 | 11. Vite 配置文件中 CSS 配置(Modules 模块化篇)
前端·vite
编程百晓君2 小时前
一文解释清楚OpenHarmony面向全场景的分布式操作系统
vue.js
暴富的Tdy2 小时前
【CryptoJS库AES加密】
前端·javascript·vue.js
neeef_se2 小时前
Vue中使用a标签下载静态资源文件(比如excel、pdf等),纯前端操作
前端·vue.js·excel
m0_748235612 小时前
web 渗透学习指南——初学者防入狱篇
前端