首页 > 编程语言 >微信小程序websocket的使用

微信小程序websocket的使用

时间:2023-03-23 10:44:35浏览次数:51  
标签:websocket socket 微信 程序 SocketTask res console data log

微信小程序websocket的使用

微信小程序中使用websocket分为两步:

一、现在微信公众平台的开发者工具中配置socket的域名

 

 

 二、开始编写业务代码

业务代码大致可以分成三个步骤:

a.发起请求,建立一个socket连接

复制代码
let SocketTask = wx.connectSocket({
      url: 'wss://app-test.kidsplace.cn:18887',
      success: function (res) {
        console.log(res)
        that.setData({
          heartbeatfail: 0
        })
        that.setData({
          socketConect: true
        })
      },
      fail: function (err) {
        console.log(err)
      }
    })
复制代码

这里是通过微信自带的一个wx.connectSocket函数来传入响应的socket域名和端口号来建立连接的,注意这个函数会返回一个SocketTask对象,里面包含了socket任务的信息,可以用来管理sock任务。一个微信小程序页面最多同时建立五条socket任务。

b.监听socket连接建立,向服务器发送身份认证协议

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 SocketTask.onOpen((res) => {      console.log(res)      // that.startHeartBeat(that.data.socketTask[0])      SocketTask.send({        //向服务器发送消息        data: JSON.stringify(params),        success: function (res) {          console.log(res, '发送成功了')                   },        fail: function (err) {          console.log(err, '发送失败了')        }      })    })
这里通过SocketTask.onOpen来监听socket是否建立成功,如果建立成功在监听的回调中调用SocketTask.send()方法向服务器发送身份认证的报文,并且监听是否发送成功。 c.身份认证成功后向服务器发送绑卡信息(本次业务需求),并且监听服务器发送的报文。 复制代码
 SocketTask.onMessage((res) => {
          //监听 WebSocket 接受到服务器的消息事件
          let data = JSON.parse(res.data)
          console.log(data, '服务器的消息')
          if (data.code == '200' && data.success && data.msgType == 'auth_ack') {
            let data = {
              type: "bindCard",
              cardId: that.data.cards[0].LeaguerCode,
              BusinessID:that.data.cards[0].BusinessID,
              phone: sessionService.get('userInfo').member.phone,
              memberId:  sessionService.get('userInfo').member.id,
              BusinessName:that.data.cards[0].BusinessName,//门店名称
              baseId:that.data.cards[0].LeaguerBaseID
            }
            SocketTask.send({
              data: JSON.stringify(data),
              success: function (res) {
                console.log(res, '绑卡认证信息发送成功')
              }
            })
          }
        })
复制代码

这里调用SocketTask.onMessage()来监听服务发送的报文,成功的回调中会返回一个data用来存储服务发送的报文。

d.在离开页面的时候关闭socket

1 2 3 4 5 6 7 8 9 10 11 12 onUnload: function () {     let that = this     this.data.socketTask[0].close({       success: function (res) {         console.log(res, '离开页面关闭socket')         that.stopHeartBeat() //离开页面并关闭socket之后停止心跳       },       fail: function (err) {         console.log(err, '关闭socket失败了')       }     }) }

注意:小程序离开原生页面会调用onUnload生命周期,也就是销毁该页面的页面栈,而进入web-view页面则会调用onHide生命周期,因为web-view相当于盖在原生页面上的组件,因此销毁socket需要注意不同的场景调用不同的生命周期钩子

总结:经过这样几个步骤跟服务器建立一个基本的websocket连接就算是完成了。

注意:SocketTask.onOpen和ocketTask.onMessage都是自动监听的因此调用一次即可

在完成websocket连接的建立之后还需要建立一个心跳连接,心跳连接的作用是用来监听socket是否断开连接,如果断开连接需要进行自动重连。

startHeartBeat() {     this.setData({       heart: true     })     this.heartbeat()   },
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 <br><br><br>heartbeat() {    let that = this    if (!this.data.heart) {      return    }    let data = {      type: 'heartBeat',      msg: 'this is heatbeat'    }    this.data.socketTask[0].send({      data: JSON.stringify(data),      success: function (res) {        console.log(res, '心跳成功,连接正常')        if (that.data.heart) {          that.data.heartBeatTimeout = setTimeout(() => {            that.heartbeat(that.data.socketTask[0])          }, that.data.timeout)        }      },      fail: function (err) {        that.data.socketTask[0].onClose((err) => {          console.log(err, '关闭的原因')        })        console.log(err, '心跳失败,连接中断')        if (that.data.heartbeatfail > 2) {          that.setData({            socketTask: []          })          that.socekt()        }        if (that.data.heart) {          that.data.heartBeatTimeout = setTimeout(() => {            that.heartbeat(that.data.socketTask[0])          }, that.data.timeout)        }        that.setData({          heartbeatfail: that.data.heartbeatfail + 1        })      }    })  },

 

  这个心跳函数的主要逻辑就是在socket建立之后向服务端发送一个心跳消息,如果发送成功了就证明socket连接正常,设置一个定时器每隔一段时间就发送一次心跳,如果失败了也设置一个定时器每隔一段时间在发一次心跳,并且记录失败的次数,如果失败的次数超过上限,就会将socketTask的任务数组置空,然后停止心跳,重新执行socket()方法建立连接跟心跳,主要是一种递归的思想。

这样一个具有心跳的socket连接就完成建立了

标签:websocket,socket,微信,程序,SocketTask,res,console,data,log
From: https://www.cnblogs.com/sexintercourse/p/17246590.html

相关文章

  • #Java程序设计实践
    Java程序设计实践Java训练集1~3总结与心得训练集链接前言:本次训练集1~3主要考察了对java基础语法的掌握,内容包括基础程序的设计,类设计,编程规则的掌握等等,学习的重点在......
  • Ubuntu 下关于 IDEA 或应用程序图标在 Dock 栏下显示异常的问题
    解决逻辑步骤:检查应用程序的桌面文件配置在/usr/share/applications/目录下检查应用程序的桌面文件路径是否正确。如果路径不正确,可以尝试修改桌面文件中的Exec属性......
  • c# winform只能打开一个程序
    if(System.Diagnostics.Process.GetProcessesByName(System.Diagnostics.Process.GetCurrentProcess().ProcessName).Length>1){MessageBo......
  • C++ 程序设计 第6章 多态与虚函数
    第6章多态与虚函数1多态的基本概念运用封装继承多态能够有效提高程序的可读性,可扩充性,可重用性。多态从字面上理解就是多种形态或多种形式。具体到C++这种面向对象程序......
  • (只需五步)ChatGPT接入微信的攻略
    ​ 先来看下用深(ruo)奥(zhi)的问题对战ChatGPT的效果: ​ 再看看程序代码能力:​  你也可以用它来写作业学习:​ 接下来,就是把ChatGPT接入微信的教程......
  • SpringBoot接入微信JSSDK,看这篇妥妥的
    先给猴急的客官上干货代码GitHub接入微信JSSDKGitHub地址Gitee接入微信JSSDKGitHub地址前言事情的起因是因为疫情严重,领导要求做一个专题页,能够尽可能帮助所需要的......
  • SpringBoot接入微信JSSDK,看这篇妥妥的
    先给猴急的客官上干货代码GitHub​​接入微信JSSDKGitHub地址​​Gitee​​接入微信JSSDKGitHub地址​​前言事情的起因是因为疫情严重,领导要求做一个专题页,能够尽可能帮......
  • #yyds干货盘点# LeetCode程序员面试金典:最长单词
    题目:给定一组单词words,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。若有多个长度相同的结果,返回其中字典序最小的一项,若没有符合要求的单词则......
  • uni-app/微信小程序:scroll-view纵向滚动高度自适应flex布局填充剩余高度
    (目录)文档uni-app文档:https://uniapp.dcloud.net.cn/component/scroll-view.html使用竖向滚动时,需要给<scroll-view>一个固定高度,通过css设置height微信文档......
  • 小程序checkbox单独监听状态改变
    小程序中的checkbox中监听change要和checkbox-group放在一起,然后在checkbox-group上监听change事件,但是这样太麻烦了,特别时对于只有一个checkbox的时候,我们可以监听tap事件......