小程序与服务器通信webSocket和UDPSocket

UDPSocket 官方文档链接UDPSocket

webSocket 官方文档链接 WebSocket 任务

先用webSocket 测试成功后,由于WSS的问题最后决定用UDPSocket,两个都记录一下。

UDPSocket

项目里主要就使用了以下几个方法, 先用wx.createUDPSocket创建UDP Socket 实例,就能调用里面的方法(前提是都要在小程序后台配置域名,这里不说)。

onListening 监听开始监听数据包消息的事件,这里不知道有在什么地方(欢迎指教),不用也没啥影响 ==

由于只在一个页面上使用,就不封装了,几个关键的变量直接作为全局变量写在js前面。直接代码

javascript 复制代码
// js
var UDPSocket 
var port

Page({

  data: {
    show: false,
    MCUID:'',
    recyclingAmount:0,
  },
  onLoad(options) {
    // console.log(options.MCUID)
    this.setData({
      MCUID: options.MCUID,
    })
    this.createUDPSocket(true) 
  },
  onShow() {
    if(!UDPSocket){ this.createUDPSocket(true)}
    
  },
  //创建UDFSocket
  createUDPSocket(isStar){
    UDPSocket = wx.createUDPSocket()
    isStar = isStar?isStar:false
    //首次调用标志isStar
    if((!UDPSocket) && (!isStar)){
      wx.showModal({
        title: 'UDFSocket未创建',
        content: '重新连接',
        showCancel: true,
        complete: (res) => {
          if(res.confirm){
            this.createUDPSocket()
          }
        }
      })
      return
    }else if(!UDPSocket){return}
    // UDPSocket 创建后
    port = UDPSocket.bind(4561) //返回绑定成功的端口号
    //监听接收数据
    this.UDPonMessage()
    //发送心跳
    this.UDPheartbeat()
    //10秒发动一次心跳
    heartbeatTimer = setInterval(this.UDPheartbeat,10*1000)
  },
  //发送
  UDPsend(data){
    data = this.formatData(data)
    UDPSocket.send({
      address: '消息的地址',
      port: port,
      message: data,
    })
  },
  //心跳
  UDPheartbeat(){
    console.log("进来心跳")
    let data = {CommandType:0}
    this.UDPsend(data)
  },
  //监听接收信息
  UDPonMessage(){
    UDPSocket.onMessage((e) => {
      console.log('收到的信息------------------------',e)
      // message是收到的信息,类型是ArrayBuffer,要自己转换
      let message = this.ArrayBufferFunc(e.message)
      console.log("转换后的信息-------",message)
      //这里处理自己的逻辑
      if(message.CommandType == 1){
        this.setData({
          show: true,
          recyclingAmount: 1,
        })
      }
    })
  },
  // 开始回收
  startRecycling(){
    console.log('点击开始回收',UDPSocket,Boolean(UDPSocket))
    if(!UDPSocket){
      this.createUDPSocket()
      return
    }
    let data = {MCUID: this.data.MCUID,CommandType:1 }
    this.UDPsend(data)
  },
  //结束回收
  closeDialog(){
    this.setData({
      show: false,
      recyclingAmount: 0,
    })
  },
  //关闭连接
  UDPclose(){
    if(!UDPSocket){return}
    clearInterval(heartbeatTimer)
    UDPSocket.close()
    UDPSocket = null
    heartbeatTimer = null
  },
  //处理发送数据
  formatData(obj){
      let today = String(new Date().getFullYear()) + (new Date().getMonth()+ 1) + new Date().getDate() 
      let randomNumber = Math.floor(Math.random() * 100000)
      let RequestID = today + randomNumber
      obj.RequestID = RequestID
      obj.PlayerID = wx.getStorageSync('PlayerID')
      // console.log(RequestID,obj)
      let keysArr = Object.keys(obj).sort()
      let splicingStr = keysArr.reduce((splicingStr,key,index)=>{
        if(index == 0){
          splicingStr =  key + "=" + obj[key]
        }else {
          splicingStr = splicingStr + "&" + key + "=" + obj[key]
        }
        return splicingStr
      },'')
      splicingStr = splicingStr +  "&SecretKey=CD463959-6080-41B3-BE48-A8BB63DE866A"
      let SignKeyValue = md5.hex_md5(splicingStr)
      obj.SignKey = SignKeyValue
      // console.log(keysArr)
      // console.log(splicingStr)
      // console.log(obj)
      console.log("处理后的JSON数据",JSON.stringify(obj))
      return JSON.stringify(obj)
  },
  //ArrayBuffer处理
  ArrayBufferFunc(buffer){
    let str = String.fromCharCode.apply(null, new Uint8Array(buffer))
    return JSON.parse(str)
  },

  onHide(){
    console.log('onHide')
    this.UDPclose()
  },
  onUnload(){
    console.log('onUnload')
    this.UDPclose()
   
  },
 

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})

webSocket

官方推荐用SocketTask 来管理,上代码

javascript 复制代码
// pages/eggRecycle/eggRecycle.js
const md5 = require('../../utils/md5.js')
var SocketTask = null;
//心跳定时器
var heartbeatTimer = null; 

Page({

  data: {
    isTask: false,// 连接是否成功
    show: false,
    MCUID:'',
    recyclingAmount:0,
  },

  onLoad(options) {
    // console.log(options.MCUID)
    this.setData({
      MCUID: options.MCUID,
    })
  },
  onShow() {
    //创建连接
    this.connectSocket()
  },
  //心跳
  heartbeat(){
    console.log("进来心跳")
    let data = {
      CommandType:0,
    }
    this.send(data)
    heartbeatTimer = setInterval(()=>{
      this.send(data)
    },10*1000)
    
  },
  // 创建连接
  connectSocket() { 
    let isTask= false
    SocketTask =  wx.connectSocket({
        url: 'ws://124.222.224.186:8800', //网上的测试地址
        header: {
          'content-type': 'application/json'
        },
        success: (res => {
          console.log('创建连接成功', res)
          
        fail: (err => {
          console.log('创建连接失败',err)
          wx.showModal({
            title: '创建连接失败'+ err,
            content: '重新连接',
            showCancel: false,
            complete: (res) => {
                that.connectSocket()
            }
          })
        })
      })
      if(ifTask){
        that.setData({
            isTask:true,
        })
        this.onOpen()
        this.onMessage()
        this.onError()
        this.onClose()
      }
  },
  // 监听 WebSocket 连接打开事件
  onOpen() {
    SocketTask.onOpen((res) => {
      console.log('监听连接打开', res)
      //心跳
      this.heartbeat()
    })
  },
  //发送信息
  send(sendMessage) {
    let that = this
    SocketTask.send({
      data: this.formatData(sendMessage),
      success(res) {
      },
      fail(err) {

      }
    })
  },
  // 接收到服务器的消息事件
  onMessage() {
    SocketTask.onMessage((data) => {
      console.log('接受到的服务器信息', data)
    })
  },
  //监听 WebSocket 连接关闭事件
  onClose() {
    SocketTask.onClose((data)=>{
      console.log('监听连接关闭',data)
      SocketTask = null
    })
  },
  //关闭事件
  close(){
    if(!this.data.isTask){return}
    clearInterval(heartbeatTimer)
    SocketTask.close()
    heartbeatTimer = null
  },
  // 监听 WebSocket 错误事件
  onError(){
    SocketTask.onError((err)=>{
      console.log('监听 WebSocket 错误事件', err)
    })
  },

  //处理数据
  formatData(obj){
    // SecretKey=CD463959-6080-41B3-BE48-A8BB63DE866A
      let today = String(new Date().getFullYear()) + (new Date().getMonth()+ 1) + new Date().getDate() 
      let randomNumber = Math.floor(Math.random() * 100000)
      let RequestID = today + randomNumber
      obj.RequestID = RequestID
      obj.PlayerID = wx.getStorageSync('PlayerID')
      // console.log(RequestID,obj)
      let keysArr = Object.keys(obj).sort()
      let splicingStr = keysArr.reduce((splicingStr,key,index)=>{
        if(index == 0){
          splicingStr =  key + "=" + obj[key]
        }else {
          splicingStr = splicingStr + "&" + key + "=" + obj[key]
        }
        return splicingStr
      },'')
      splicingStr = splicingStr +  "&SecretKey=CD463959-6080-41B3-BE48-A8BB63DE866A"
      let SignKeyValue = md5.hex_md5(splicingStr)
      obj.SignKey = SignKeyValue
      // console.log(keysArr)
      // console.log(splicingStr)
      // console.log(obj)
      console.log("处理后的JSON数据",JSON.stringify(obj))
      return JSON.stringify(obj)
  },


  onHide(){
    console.log('onHide')
    this.close()
  },
  onUnload(){
    console.log('onUnload')
    this.close()
  },
  openDialog(){
    //启动回收
    let data = {MCUID: this.data.MCUID,CommandType:1 }
    console.log("发送启动")
    this.send(data)
    this.setData({
      show: true,
    })
  },
  //回收记录
  getRecord(){
    wx.navigateTo({
      url: '../orderRecord/orderRecord?active=3',
    })
  },



  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})
相关推荐
G佳伟4 小时前
‌微信小程序Webview转发页面空白问题解决方案‌
微信小程序·小程序
vx_vxbs666 小时前
【SSM电动车智能充电服务平台】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·mysql·spring cloud·小程序·php·idea
低代码布道师8 小时前
医疗小程序12出诊列表
低代码·小程序
Coder-coco9 小时前
游戏助手|游戏攻略|基于SprinBoot+vue的游戏攻略系统小程序(源码+数据库+文档)
java·vue.js·spring boot·游戏·小程序·论文·游戏助手
小小王app小程序开发1 天前
盲盒小程序一番赏衍生玩法:魔王赏、非酋赏、狂欢赏差异化分析
小程序
2501_915106321 天前
iOS App 测试工具全景分析,构建从开发调试到线上监控的多阶段工具链体系
android·测试工具·ios·小程序·uni-app·iphone·webview
头发还在的女程序员2 天前
基于JAVA语言的短剧小程序-抖音短剧小程序
java·开发语言·小程序
2501_916007472 天前
iOS 应用性能测试的工程化流程,构建从指标采集到问题归因的多工具协同测试体系
android·ios·小程序·https·uni-app·iphone·webview
book多得2 天前
刷题专用微信小程序推荐
微信小程序·小程序
00后程序员张2 天前
iOS 抓不到包怎么办?从 HTTPS 解密、QUIC 排查到 TCP 数据流分析的完整解决方案
android·tcp/ip·ios·小程序·https·uni-app·iphone