zoukankan      html  css  js  c++  java
  • Vue中使用websocket

    简单例子

    <template>
      <div class="test">
    
      </div>
    </template>
    
    <script>
      export default {
        name : 'test',
        data() {
          return {
            websock: null,
          }
        },
        created() {
          this.initWebSocket();
        },
        destroyed() {
          this.websock.close() //离开路由之后断开websocket连接
        },
        methods: {
          initWebSocket(){ //初始化weosocket
            const wsuri = "ws://127.0.0.1:8080";
            this.websock = new WebSocket(wsuri);
            this.websock.onmessage = this.websocketonmessage;
            this.websock.onopen = this.websocketonopen;
            this.websock.onerror = this.websocketonerror;
            this.websock.onclose = this.websocketclose;
          },
          websocketonopen(){ //连接建立之后执行send方法发送数据
            let actions = {"test":"12345"};
            this.websocketsend(JSON.stringify(actions));
          },
          websocketonerror(){//连接建立失败重连
            this.initWebSocket();
          },
          websocketonmessage(e){ //数据接收
            const redata = JSON.parse(e.data);
          },
          websocketsend(Data){//数据发送
            this.websock.send(Data);
          },
          websocketclose(e){  //关闭
            console.log('断开连接',e);
          },
        },
      }
    </script>
    <style lang='less'>
     
    </style>
    
    

    封装后

    创建websocket.js

    let Socket = ''
    let setIntervalWesocketPush = null
    
    /**
     * 建立websocket连接
     * @param {string} url ws地址
     */
    export const createSocket = url => {
      Socket && Socket.close()
      if (!Socket) {
        console.log('建立websocket连接')
        Socket = new WebSocket(url)
        Socket.onopen = onopenWS
        Socket.onmessage = onmessageWS
        Socket.onerror = onerrorWS
        Socket.onclose = oncloseWS
      } else {
        console.log('websocket已连接')
      }
    }
    
    /**打开WS之后发送心跳 */
    const onopenWS = () => {
      sendPing()
    }
    
    /**连接失败重连 */
    const onerrorWS = () => {
      Socket.close()
      clearInterval(setIntervalWesocketPush)
      console.log('连接失败重连中')
      if (Socket.readyState !== 3) {
        Socket = null
        createSocket()
      }
    }
    
    /**WS数据接收统一处理 */
    const onmessageWS = e => {
      window.dispatchEvent(new CustomEvent('onmessageWS', {
        detail: {
          data: e.data
        }
      }))
    }
    
    /**
     * 发送数据但连接未建立时进行处理等待重发
     * @param {any} message 需要发送的数据
     */
    const connecting = message => {
      setTimeout(() => {
        if (Socket.readyState === 0) {
          connecting(message)
        } else {
          Socket.send(JSON.stringify(message))
        }
      }, 1000)
    }
    
    /**
     * 发送数据
     * @param {any} message 需要发送的数据
     */
    export const sendWSPush = message => {
      if (Socket !== null && Socket.readyState === 3) {
        Socket.close()
        createSocket()
      } else if (Socket.readyState === 1) {
        Socket.send(JSON.stringify(message))
      } else if (Socket.readyState === 0) {
        connecting(message)
      }
    }
    
    /**断开重连 */
    const oncloseWS = () => {
      clearInterval(setIntervalWesocketPush)
      console.log('websocket已断开....正在尝试重连')
      if (Socket.readyState !== 2) {
        Socket = null
        createSocket()
      }
    }
    /**发送心跳
     * @param {number} time 心跳间隔毫秒 默认5000
     * @param {string} ping 心跳名称 默认字符串ping
     */
    export const sendPing = (time = 5000, ping = 'ping') => {
      clearInterval(setIntervalWesocketPush)
      Socket.send(ping)
      setIntervalWesocketPush = setInterval(() => {
        Socket.send(ping)
      }, time)
    }
    

    下载 (也可复制源码,放在本地,使用方式相同)

    npm install @sven0706/websocket -S
    

    使用

    
    // 在main.js或需要使用的地方引入并建立连接
    import { createSocket } from '@sven0706/websocket'
    createSocket('wss://api.baidu.com')
    
    
    // 发送消息
    import { sendWSPush } from '@sven0706/websocket'
    sendWSPush(data)
    
    // 接收消息
    const getsocketData = e => {  // 创建接收消息函数
      const data = e && e.detail.data
      console.log(data)
    }
    // 注册监听事件
    window.addEventListener('onmessageWS', getsocketData)
    
    // 在需要的时候卸载监听事件,比如离开页面
    window.removeEventListener('onmessageWS', getsocketData)
    

    API

    仅三个api, 且一般只需要用到`createSocket`, `sendWSPush`
    
    /**
     * 建立websocket连接
     * @param {string} url ws地址
     */
    createSocket(url)
    
    /**
     * 发送数据
     * @param {any} message 需要发送的数据
     */
     sendWSPush(message)
    
    /**发送心跳
     * @param {number} time 心跳间隔毫秒 默认5000
     * @param {string} ping 心跳名称 默认字符串ping
     */
     sendPing()
    

    巨人的肩膀

    js websocket断线重连
    js封装一个websocket

  • 相关阅读:
    三十岁前不要去在乎的29件事
    大型网站架构演变和知识体系
    性情中人。。。
    blog搬新家了。。。把以前的文章也都搬过来了。看看以前的文章,想起了很多。。。
    2006620 11:42:00 王子劳尔,王者归来
    2006620 11:40:00 这一刻,便是我们的永远给最爱的安德烈.舍普琴科
    第一份工作一定要选一家好公司 摘在 唐骏 《我的成功可以复制》
    2006811 11:29:00 搜索算法及其在ACM竞赛中的应用(作者/刘力科 计算机系01级4班)
    内核学习驱动隐藏进程
    2005129 17:58:00 新年快乐
  • 原文地址:https://www.cnblogs.com/niuben/p/14607900.html
Copyright © 2011-2022 走看看