zoukankan      html  css  js  c++  java
  • js封装一个websocket

    原文:https://www.jianshu.com/p/938004c22ed9

    创建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()
  • 相关阅读:
    Android中TextView中内容不换行的解决方法
    对ORA-01795: 列表中的最大表达式数为 1000的处理(算法:计算数量及切割)
    poj 1094 Sorting It All Out (拓扑排序)
    Automatically generate serial number in abap
    Getting started with new I/O (NIO)--reference
    JDK源码重新编译——支持eclipse调试JDK源码--转载
    Reactor构架模式--转载
    分布式服务框架 Zookeeper -- 管理分布式环境中的数据--转载
    深入分析 iBATIS 框架之系统架构与映射原理--转载
    Servlet 工作原理解析--转载
  • 原文地址:https://www.cnblogs.com/showcase/p/14000101.html
Copyright © 2011-2022 走看看