vue3 ts Vuex使用websocket协议

本文作者使用的是ts vue3的setup语法糖,大家注意使用的vue版本!

在stroe中

import { createStore } from 'vuex'
import { stateInt } from '../interface/storeInterface'
const state: stateInt = {
  //推送消息
  data: {},
  webSocket: null,
}
export default createStore({
  state,
  mutations: {
    //websocket初始化
    initWebsocket(state) {
      state.webSocket = new WebSocket(
          // 此处填写你要连接的ws地址
        'ws://127.0.0.1:3000/socket/'   Math.random()
      )
      //建立连接
      state.webSocket.onopen = function () {
        /*
         * 连接成功
         * */
        console.log('通讯开始')
        // 发送心跳防止ws协议自动断联
        setInterval(() => {
          state.webSocket.send('1')
        }, 1000 * 60)
      }
      //接收服务端消息
      state.webSocket.onmessage = function (e) {
        /*
         * 收到消息时回调函数
         * */
        console.log('收到的数据:', e.data)
        // 如果数据对象为字符串,可转换为对象格式
        let data = JSON.parse(e.data)
        state.data = e.data
        console.log(data)
      }
      state.webSocket.onerror = function () {
        /*
         * 通讯异常
         * */
        console.log('通讯异常')
      }
      state.webSocket.close = function () {
        /*
         * 关闭连接时回调函数
         * */
        console.log('连接已断开')
      }
    },
  },
  actions: {
  },
  modules: {},
})

/interface/storeInterface 文件下的interface接口

export interface stateInt {
  data: Object
  webSocket: WebSocket
}

vue3中

在App.vue中,语法糖格式下

<script lang="ts" setup>
    import { onBeforeMount } from 'vue'
    import { useStore } from 'vuex'
    /**
     * 仓库
     */
    const store = useStore()
    //websocket初始化
    const initSocket = () => {
      store.commit('initWebsocket')
    }
    
    onBeforeMount(() => {
      //console.log('2.组件挂载页面之前执行----onBeforeMount')
      initSocket()
    })
</script>

vue封装websocket

项目中需要使用websocke,这个是我自己修修改改好多次之后用得最顺手的一版,分享一下。

这个封装需要搭配vuex使用,因为收到的数据都保存在vuex中了,真的绝绝子好用,解决了我一大堆问题。

如果需要可以搭配上心跳、websocke重连。

话说,vuex的使用也有好多坑,在踩坑的路上狂奔,下次再写vuex的

封装的socket.js文件内容

var websock = null;
var global_callback = null;
var serverPort = "80"; // webSocket连接端口
var wsuri = "ws://"   window.location.hostname   ":"   serverPort;
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 };

封装的websocke暴露三个接口

  • sendSock用于发送数据
  • createWebSocket用于创建连接、对收到的数据进行处理
  • closeSock 用于关闭连接

使用方法

先看目录在这里插入图片描述

1、建立连接

建立好socket.js文件之后就可以开始使用了,因为我的登录是用axios的,只有登录成功(进入主页之后才建立websocke连接),所以我把连接写在了Home.vue的文件中。

第一步:导入文件

import { sendSock, createWebSocket, closeSock } from "@/api/socket";

第二步:初始化时建立websocket连接

created() {
    this.init();
    ......
  },
  methods: {
    init() {
      createWebSocket(this.global_callback);
      ......
    },
 
    // websocket的回调函数,msg表示收到的消息
    global_callback(msg) {
      console.log("websocket的回调函数收到服务器信息:"   JSON.stringify(msg));
      // console.log("收到服务器信息:"   msg);
     
      switch (msg.operate) {//
        case "autoIndex":
          this.$store.dispatch("setAutoIndex", msg);
          break;
        case "allChannelSwitch":
          this.$store.dispatch("setAllChannelSwitch", msg);
          break;
        case "singleChannelSwitch":
          this.$store.dispatch("setSingleChannelSwitch", msg);
          break;
        case "sceneSelect":
          this.$store.dispatch("setSceneSelect", msg);
          break;
          ......
      }
    },
  },

msg.operate是用于判断收到通信数据

this.$store.dispatch()是用于异步修改vuex保存的数据的函数。

界面中通信数据收到后都保存在vuex中,需要该数据的地方就从vuex中获取

2、发送数据

第一步:导入文件

import { sendSock } from "@/api/socket";

第二步:发送数据

 var sendData = {
        operate:"singleChannelSwitch",
        index:index 1,
        opera:row.button_relay
      };
      sendSock(JSON.stringify(sendData));

3、关闭连接

第一步:导入文件

import { closeSock} from "@/api/socket";

第二步:关闭连接

closeSock();

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。

vue3+ts+Vuex中使用websocket协议方式的更多相关文章

  1. 五分钟学会HTML5的WebSocket协议

    这篇文章主要介绍了五分钟学会HTML5的WebSocket协议,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. 前端监听websocket消息并实时弹出(实例代码)

    这篇文章主要介绍了前端监听websocket消息并实时弹出,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. ios – Websockets可以在移动电话上工作吗?

    相关地,我怀疑长轮询客户端可能是实现类似功能的好方法,但我想知道我可能遇到的移动特定问题.到目前为止,我已经读过长时间的轮询请求可能会对电池寿命产生相当大的影响.我还听说iOS以某种方式限制了对单个服务器的连接数量,这可能是个问题.有没有人在使用实时组件的移动应用程序上工作?

  5. ios-swift,objective-c协议实现

    作为隐式解开的可选项.

  6. ios – 红蜘蛛代表没有被召集

    变量不是nil,我有一个很好的连接,url是正确的,但没有调用委托方法.我也正在实现WebSocketDelegate解决方法套接字应该是您的类的属性或变量,以确保它附近.如果仅在函数堆栈上分配它,它将超出范围,并且永远不会调用委托以下是我在项目中使用的代码,以防万一这是link到故事板,以防万一你想要

  7. swift 实现websocket与后台通信(swift 如何构建简单的json字符串)

    一个应用不可避免要与服务器进行通信,主要有,http与socket。http暂时不论,我们先看看socket下面衍生的websocket,今天我就把自己怎么利用websocket与服务器进行交互记录下来:首先你需要集成websocket到自己的项目,如果不明白如何集成,请看上一篇《swift集成websocket库》集成websocket到自己项目后还需要添加SwiftyJSON到自己项目,具体步骤和集成websocket一样。首先打开你项目,记得通过cocoapods生成的.xcworkspace文件打

  8. Swift Selector

    看了喵神的Swifter100个必备的小tips总结下swift中不支持@selector关键字,将SEL重新定义为结构体了。

  9. 如何在Android上托管REST webservices?

    有没有人知道一个用Java编写的能够在Android上托管REST服务的开源Web服务器?

  10. android – WebSocket没有关闭重装应用程序(React Native)

    附:哦,我用Android进行测试.解决方法你的代码看起来不错.通过刷新你的意思是在调试模式下运行时刷新javascript?

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部