vue websocket即时通讯

最近公司在写一些即时通讯的玩意,之前没有接触过,在网上找了一些资料整理一下,封装成组件使用,参考一下

直接上代码,先在utils 下新建websocket.js 文件,将下面代码直接复制!

import { Message } from 'element-ui'
let websock = null
var tryTime = 0
let wsUrl = ''

// 接收ws后端返回的数据
function websocketonmessage(e, successCallback) {
  successCallback(JSON.parse(e.data))
}

/**
 * 发起websocket连接
 * @param {Object} agentData 需要向后台传递的参数数据
 */
function websocketSend(agentData) {
  // 加延迟是为了尽量让ws连接状态变为OPEN
  setTimeout(() => {
    // 添加状态判断,当为OPEN时,发送消息
    if (websock.readyState === websock.OPEN) { // websock.OPEN = 1
      // 发给后端的数据需要字符串化
      websock.send(JSON.stringify(agentData))
    }
    // if (websock.readyState === websock.CLOSED) { // websock.CLOSED = 3
    //   console.log('websock.readyState=3')
    //   Message.error('ws连接异常,请稍候重试')
    // }
  }, 3000)
}

// 关闭ws连接
function websocketclose(e) {
  // e.code === 1000  表示正常关闭。 无论为何目的而创建, 该链接都已成功完成任务。
  // e.code !== 1000  表示非正常关闭。
  if (e && e.code !== 1000) {
    if (tryTime < 50) {
      setTimeout(function() {
        websock = null
        tryTime++
        initWebSocket()
        console.log(`${tryTime}次重连`)
      }, 3 * 1000)
    } else {
      Message.error('重连失败!请稍后重试')
    }
    // Message.error('ws连接异常,请稍候重试')
    // errorCallback()
  }
}
// 建立ws连接
function websocketOpen(e) {
  console.log('连接成功')
}

// 初始化weosocket
function initWebSocket(successCallback) {
  if (typeof (WebSocket) === 'undefined') {
    Message.error('您的浏览器不支持WebSocket,无法获取数据')
    return false
  }
  // ws请求完整地址
  const requstWsUrl = wsUrl
  websock = new WebSocket(requstWsUrl)

  websock.onmessage = function(e) {
    websocketonmessage(e, successCallback)
  }
  websock.onopen = function() {
    websocketOpen()
  }
  websock.onerror = function() {
    // Message.error('ws连接异常,请稍候重试')
    // errorCallback()
  }
  websock.onclose = function(e) {
    websocketclose(e)
  }
}

/**
 * 发起websocket请求函数
 * @param {string} url ws连接地址
 * @param {Object} agentData 传给后台的参数
 * @param {function} successCallback 接收到ws数据,对数据进行处理的回调函数
 * @param {function} errCallback ws连接错误的回调函数
 */
export function sendWebsocket(url, agentData, successCallback) {
  wsUrl = url + agentData.group_id
  initWebSocket(successCallback)
  console.log(wsUrl, 'wsurl')
  // messageCallback = successCallback
  websocketSend()
}

/**
 * 关闭websocket函数
 */
export function closeWebsocket() {
  if (websock) {
    websock.close() // 关闭websocket
    websock.onclose() // 关闭websocket
  }
}

封装好后,在你需要使用的页面引入

import { sendWebsocket, closeWebsocket } from '@/utils/websocket.js'

使用时候,你可根据自己的需要出发这俩方法,我是直接在mounted函数中使用

// ws连接成功,后台返回的ws数据,组件要拿数据渲染页面等操作
    wsMessage(data) {
      const dataJson = JSON.parse(data) 
     // 在这里取到后台的数据后可以写相关逻辑
    },
    requstWs() {
      // 防止用户多次连续点击发起请求,所以要先关闭上次的ws请求。
      closeWebsocket()
      this.percentage = 1
      this.timeNumber = 0
      // 传递给后端的数据 这里的obj 我是作为参数进行传递的 , 如果你需要与服务端对话的话obj 也可以作为消息模板进行传递
      // 但是在websocket.js 里需要修改下 websocketSend 这个函数 
      const obj = {
        group_id: '这里放你需要拼接或者传的参数'
      }
      // 发起ws请求
      sendWebsocket('ws://与后台约定的地址', obj, this.wsMessage)
    },

就这些代码,简单方便!
这个也是参考的别的博主发的,希望有帮助!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值