小程序全局socket使用 并自定义发送心跳

7 篇文章 0 订阅
1 篇文章 0 订阅

 

//app.js
App({
  globalData: {
    userInfo: null,
    socketUrl: "wss:.....", //socketUrl
    //延迟
    timeout: 10000,
    socketHeartTimer: null,
    //socket连接回调函数
    callback: function () {},
    //socket连接定时器
    socketClientTimer: null,
    //当前socket是否连接
    isSocketConnect: false
  },

  //建议在这做全局登录标识 是否已经登录决定是否onShow中是否调用连接
  onLaunch: function () {},

  //生命周期onShow中调用socket连接
  onShow: function () {
    //此处可以根据登录状态判断是否调用连接socket
    // 连接socket
    // 检查用户登录状态,并决定是否开启socket
    this.checkLoginUserSocket();
    //判断是否登录 连接socket
    this.globalData.socketClientTimer = setInterval(() => {
      // 定时器---检查用户登录状态,并决定是否开启socket
      this.checkLoginUserSocket();
    }, 30000)
  },

  // 检查用户登录状态,并决定是否开启socket
  checkLoginUserSocket: function () {
    if ("已经登录状态下根据情况判断") {
      //登录状态下调用连接socket 且判断是否已经连接socket 
      if (!this.globalData.isSocketConnect) {
        // console.log("-----用户一登录---连接socket")
        this.connectSocketFunciton()
      }
    } else {
      // console.log("-----用户未登录--关闭socket")
      //未登录状态下清除定时器关闭socket
      this.closeSocketFunction()
    }
  },

  // 小程序进入后台
  onHide: function () {
    // 关闭全局socket状态连接定时器
    clearInterval(this.globalData.socketClientTimer)
    // 关闭socket
    this.closeSocketFunction()
  },

  //小程序连接socket
  connectSocketFunciton: function () {
    var that = this
    var socketUrl = this.globalData.socketUrl
    wx.connectSocket({
      url: socketUrl,
      success: (res => {
        // 标识socket已连接
        that.globalData.isSocketConnect = true
        // 初始化连接监听
        that.initEventHandler()
      }),
      fail: (fail => {})
    })
  },

  // 绑定监听
  initEventHandler: function () {
    var that = this
    // socket连接开启
    wx.onSocketOpen((result) => {
      // 开启心跳
      that.startHeart()
    })
    // socket连接关闭
    wx.onSocketClose((res) => {
      if (that.globalData.isSocketConnect) {
        that.connectSocketFunciton()
      }
    })
    // 接收socket消息
    wx.onSocketMessage((res) => {
      console.log("onSocketMessage")
      console.log(res)
      //第一次消息如果为init就绑定uid
      var data = JSON.parse(res.data)
      //这里data可以根据后端返回的数据做一些处理 根据自己的需求做出对应的处理
      // 全局socket接收消息的方法回调
      that.globalData.callback(res)
    })
  },

  //发送心跳
  startHeart: function () {
    if (this.globalData.isSocketConnect) {
      this.globalData.socketHeartTimer = setInterval(() => {
        var msg = JSON.stringify({
          'data': 'ping'
        })
        wx.sendSocketMessage({
          data: msg,
          success: function (res) {},
          fail: function (res) {}
        })
      }, 10000)
    } else {
      clearTimeout(this.globalData.socketHeartTimer)
    }
  },

  //此页面关闭socket和定时器的函数
  closeSocketFunction: function () {
    if (this.globalData.isSocketConnect) {
      // 标识socket已断开
      this.globalData.isSocketConnect = false
      // 关闭socket连接
      wx.closeSocket()
      // 关闭socket心跳定时器
      clearInterval(this.globalData.socketHeartTimer)
    }

  }
})
//在外面调用的方式

  onLoad:function(){
    this.onSoekctCallback()
  },    

  //根据需求对data做出自己的处理
  onSoekctCallback: function () {
    var that = this
    app.globalData.callback = function (res) {
      var data = JSON.parse(res.data)
        
    }
  },

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值