vue中使用websock的两种方法

前言:

       到目前为止,使用websock很多次了,整理下资料,共两种,一种时ws:的,一种是普通的http(这种方法主要是因为对后端技术要求比较低)

在线测试websock

方法一:

1 定义组件: websockDiv.vue

<template>
      <div></div>
</template>

<script>
  let socket;
  // 给服务器发送一个字符串:
  export default {
    data() {
      return {
        // 连接标志位
        lockReconnect: false,
        wsCfg: {
          // websocket地址
          url: "wss://papp.yunmaizhineng.com:8443/payment/scan"
        }
      };
    },
    methods: {
      createWebSocket() {
        try {
          // 创建Web Socket 连接
          socket = new WebSocket(this.wsCfg.url);
          // 初始化事件
          this.initEventHandle(socket);
        } catch (e) {
          // 出错时重新连接
          this.reconnect(this.wsCfg.url);
        }
      },
      initEventHandle(socket) {
        // 连接关闭时触发
        socket.onclose = () => {
          console.log("连接关闭");
        };
        // 通信发生错误时触发
        socket.onerror = () => {
          // 重新创建长连接
          this.reconnect();
        };
        // 连接建立时触发
        socket.onopen = () => {
          console.log("连接成功");
          this.$emit('successWeb')
        };
        // 客户端接收服务端数据时触发
        socket.onmessage = msg => {
          // 业务逻辑处理
          console.log(msg.data, "ws:data");
          let data =  JSON.parse(msg.data)
          this.$emit('getSockData',data)
        };
      },
      reconnect() {
        if (this.lockReconnect) {
          return;
        }
        this.lockReconnect = true;


        // 没连接上会一直重连,设置延迟避免请求过多
        setTimeout(() => {
          this.lockReconnect = false;
          this.createWebSocket(this.wsCfg.url);
        }, 2000);
      },
      test(data) {
        // 给服务器发送一个字符串:
        // ws.send("Hello!");
        socket.send(data);
      }
    },
    mounted() {

    }
  };
</script>

2 再template中

 <websockDiv ref="webso" @getSockData="getSockData" @successWeb="successWeb"></websockDiv>

3 methods中

   /**
     * websock后端返回数据调用
     * */
    getSockData(data){
      if(data.status == 99){
        Toast('支付失败');
      }else if(data.status == 1){
        Toast('支付成功,支付金额为:'+(data.amount/100).toFixed(2));
        this.initUserDataT();//刷新方法
      }

    },
    /**
     * websock连接成功
     * */
    successWeb(){
        this.$refs.webso.test(this.user.card_id);//websock给后台传参数
    },

方法二(特殊):文献

1 安装两个插件

cnpm i --s sockjs-client stompjs

2 引入

import SockJS from 'sockjs-client';
import Stomp from 'stompjs';
/**
   * websock-公共方法
   */
  initWebSocket(data){
    this.connection(data);
    //模拟客户端向后台推送消息
  },
  //建立连接
  connection(data) {
    let baseUrl = 'wss://papp.yunmaizhineng.com:8443/payment/scan';//实时的服务路径
     let nowMethod = '';// 方法
    // let pageName = data.name;//页面名称
    //  let pageName = '作业管控';//页面名称
    // 建立连接对象
    //连接服务端提供的通信接口,连接以后才可以订阅广播消息和个人消息
    let _that=this;
    //后台服务ip和port
    _that.socket = new SockJS(baseUrl);
    // 获取STOMP子协议的客户端对象
    _that.stompClient = Stomp.over(_that.socket);
    // 向服务器发起websocket连接
    _that.stompClient.connect('guest','guest',(frame) => {
      // 订阅服务端提供的某个topic
      _that.stompClient.subscribe(nowMethod, (msg) => {
        //msg.body存放的是服务端发送给我们的信息
        let  resData= JSON.parse(msg.body);
        if(pageName == '作业管控'){
          let res = {}
          res.data = resData;
          this.zygk_websock(res);
        }

      });
    }, (err) => {
    });
  },
  //关闭连接
  disconnect() {
    if (this.stompClient != null) {
      this.stompClient.disconnect();
      console.log("Disconnected");
    }
  },
  websocketclose(e){ //关闭
    console.log("connection closed (" + e.code + ")");
  },

  /**
   * websock-数据接收以后的方法
   */
  zygk_websock(data){
    store.commit('getYYBBData',data);
  }

到此为止

猜你喜欢

转载自blog.csdn.net/qq_41619796/article/details/107953306