Vue中webSocket写法总结

前言:vue项目中,我们常会使用websocket实现长连接,实时更新页面数据状态,那么封装一个实用的websocekt就尤为重要,以下是本人项目过程中,针对websocket进行的封装,仅供学习参考,如果大家有更好的方案,欢迎留言分享。

 在vue项目的utils文件夹下,新建websocket.js文件,如下:

let limitConnect = 3
let timeConnect = 0
let timerWs = null

let Socket = ''
// 缓存ip
let ip = ''
/**
 * 建立websocket连接
 * @param {string} url ws地址
 */
export const createSocket = url => {
  ip = url
  Socket = new WebSocket(url)
  // 发送心跳
  Socket.onopen = onopenWS
  // 接收消息
  Socket.onmessage = onmessageWS
  // 断开重连
  Socket.onclose = oncloseWS
}

// 断开连接
export const closeSoket = () => {
  if (Socket.readyState === 1) {
    Socket.close()
    Socket = null
  }
}

/** 打开WS之后发送心跳 */
const onopenWS = () => {
  sendPing()
}

/** WS数据接收统一处理 (通过事件订阅处理)*/
const onmessageWS = e => {
  window.dispatchEvent(
    new CustomEvent('onmessageWS', {
      detail: {
        data: e.data
      }
    })
  )
}

/** 断开重连 */
const oncloseWS = () => {
  reconnectWs()
}
/**
 * @description 重连机制
 */
const reconnectWs = () => {
  if (limitConnect > 0) {
    limitConnect--
    timeConnect++
    console.log(`第${timeConnect}次重连`)
    setTimeout(() => {
      createSocket(ip)
    }, 2000)
  } else {
    console.log('webSocket连接超时')
  }
}

/**
 * 发送数据
 * @param {any} message 需要发送的数据
 */
export const sendWSPush = message => {
  return new Promise((reslove, reject) => {
    Socket.send(JSON.stringify(message))
    reslove(Socket.readyState)
  })
}

/** 发送心跳
 * @param {number} time 心跳间隔毫秒10s 默认5min=5*60s 1s=1000ms
 * @param {string} ping 心跳名称 默认字符串ping
 */
export const sendPing = (time = 1000 * 10, ping = 'ping') => {
  if (timerWs) {
    clearInterval(timerWs)
    timerWs = null
  }
  timerWs = setInterval(() => {
    Socket.send(ping)
  }, time)
}

// Socket.readyState状态码:0:正在连接;1:连接成功,可以通信  2:表示连接正在关闭 3:表示连接已经关闭,或者打开连接失败

 页面中调用:

//引入创建websocket的方案
import { createSocket } from '../../utils/webscoket' 
//在data中定义一个变量:
data(){
return{
  getSocketData:null
}
}
//在methods中写个方法initWebsSocket,在mounted初始化websocket
initWebsSocket() {
      const wsUrl="ws:xxx:xxx:xxx:xxx:xxxx"
      createSocket(wsUrl)
      // 创建接收消息函数
      this.getSocketData = e => {
        const data = e && e.detail.data
        // 如果不是连接成功的心跳数据,弹出提示
        if (data !== 'pong') {
          this.handleNotifyMsg(data)  //处理消息的函数
        }
      }
      // 注册监听事件
      window.addEventListener('onmessageWS', this.getSocketData)
    },

注意在页面 destroyed中的移除消息处理监听

destroyed() {
    // 移除监听器
    window.removeEventListener('onmessageWS', this.getSocketData)
  },

如果不做封装,可以参考以下用法使用:

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue使用WebSocket可以通过WebSocket API来实现实时通信。以下是一个基本的示例: 首先,安装VueWebSocket库,例如`vue-native-websocket`,可以使用npm或yarn命令进行安装: ```bash npm install vue-native-websocket ``` 然后,在Vue的入口文件(通常是main.js)导入和配置WebSocket: ```javascript import VueNativeSock from 'vue-native-websocket'; Vue.use(VueNativeSock, 'ws://localhost:8080', { format: 'json', reconnection: true, reconnectionAttempts: 5, reconnectionDelay: 3000, }); ``` 上述代码,调用`Vue.use`方法来注册WebSocket插件,并传入WebSocket服务器的URL。你也可以根据需要配置其他选项,如数据格式、重新连接设置等。 接下来,你可以在Vue组件使用WebSocket进行实时通信。例如,在一个组件发送和接收消息: ```javascript export default { data() { return { message: '', receivedMessages: [], }; }, methods: { sendMessage() { this.$socket.send(this.message); this.message = ''; }, }, created() { this.$options.sockets.onmessage = (event) => { this.receivedMessages.push(event.data); }; }, }; ``` 以上代码,`this.$socket`用于发送消息到服务器,接收到的消息通过监听`this.$options.sockets.onmessage`事件来处理,并将其存储在`receivedMessages`数组。 请注意,上述示例只是一个简单的示例,实际应用可能需要更多的错误处理和其他逻辑来处理WebSocket通信。 这是一个使用VueWebSocket实现实时通信的基本示例,你可以根据自己的需求进行扩展和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值