uniapp中websocket的使用(一)适用页面只会存在单个长连接

将websocket封装成一个类

一、封装的类

const _WEBSOCKET = {
  //是否打开连接
  isOpen: false,
  //连接socket
  connectSocket(url,successFunc = null, errorFunc = null) {
    try {
      //连接socket
      uni.connectSocket({
        url,
        success() {
          console.log('websocket连接成功!')
        }
      })
      //监听socket连接
      uni.onSocketOpen((res) => {
        this.isOpen = true
        console.log('WebSocket连接已打开!')
        if (successFunc) {
          successFunc(res)
        }
      })
      //监听socket连接失败
      uni.onSocketError((res) => {
        this.isOpen = false
        console.log('WebSocket连接打开失败,请检查!')
        if (errorFunc) {
          errorFunc(res)
        }
      })
      //监听收到消息
      uni.onSocketMessage((res) => {
        console.log('收到服务器内容:' + res.data)
      })
      //监听socket关闭
      uni.onSocketClose((res) => {
        console.log('WebSocket 已关闭!')
        this.isOpen = false
      })
    } catch (error) {
      console.log('err:' + error)
    }
  },
  //发送消息
  sendMessage(msg = '', successFunc = null, errorFunc = null) {
    if (!this.isOpen || !msg) {
      if (errorFunc) {
        errorFunc('未传消息内容或连接未打开!')
      }
      return
    }
    uni.sendSocketMessage({
      data: msg,
      success(res) {
        console.log('消息发送成功!')
        if (successFunc) {
          successFunc(res)
        }
      },
      fail(err) {
        console.log('消息发送失败!')
        if (errorFunc) {
          errorFunc(err)
        }
      }
    })
  },
  //关闭连接
  closeSocket() {
    if (!this.isOpen) {
      return
    }
    //关闭socket连接
    uni.closeSocket()
  }
}

export default _WEBSOCKET

二、在App.vue中使用

<script>
//导入websocket对象
import websocket from '@/common/services/websocket'

//定义定时器
let globalTimer = null

export default {
  onShow() {
    try {
      //建立socket连接
      websocket.connectSocket('wss://xxxxxxxx.com',() => {
        //如果连接成功则发送心跳检测
        this.heartBeatTest()
      })
    } catch (error) {
      console.log('App err:' + error)
    }
  },
  onHide() {
    //关闭socket
    websocket.closeSocket()
  },
  methods: {
    //心跳检测
    heartBeatTest() {
      //清除定时器
      clearInterval(globalTimer)
      //开启定时器定时检测心跳
      globalTimer = setInterval(() => {
        //发送消息给服务端
        websocket.sendMessage(
          JSON.stringify({ action: 'ping'}), //与服务端约定好消息格式
          null,
          () => {
            //如果失败则清除定时器
            clearInterval(globalTimer)
          }
        )
      }, 10000)
    }
  }
}
</script>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值