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>
相关推荐
三小河15 小时前
Vite 项目性能优化实践:从打包体积到首屏加载
前端
酉鬼女又兒15 小时前
HTML零基础快速入门篇(可用于备赛蓝桥杯Web应用开发) 牛客手把手戴刷FED1~8:基本标签,基本标签,媒体标签详解
前端·职场和发展·蓝桥杯·html·web
weixin1997010801616 小时前
搜好货商品详情页前端性能优化实战
java·前端·python
SuperEugene16 小时前
NPM Script 实战:常用命令设计与封装|Vue 工程化篇
前端·javascript·vue.js·前端框架·npm
前端进阶之旅16 小时前
React 18 并发特性实战指南:提升大型应用性能的关键技术
前端·react.js·前端框架
恋猫de小郭16 小时前
Android 性能迎来提升:内核引入 AutoFDO 普惠所有 15-16 设备
android·前端·flutter
小霍同学16 小时前
Vue 动态表单(Dynamic Form)
前端·vue.js
Dragon Wu16 小时前
Taro 小程序开发注意事项(不定期记录更新)
前端·javascript·小程序·typescript·taro
wangfpp16 小时前
多端统一你真的会了吗?
前端·javascript·架构
小霍同学16 小时前
Vue 动态组件(Dynamic Components)
前端·vue.js