微信小程序 實現websocket長連接 以及斷開連接之后自動重連


app.js

let socketMsgQueue = []
let isLoading = false

App({
  globalData: {
    userInfo: null,
    localSocket: {},
    callback: function () {}
  },
  showLoad() {
    if(!isLoading) {
      wx.showLoading({
        title: '請稍后...',
      })
      isLoading = true
    }
  },
  hideLoad() {
    wx.hideLoading()
    isLoading = false
  },
  initSocket() {
    let that = this
    that.globalData.localSocket = wx.connectSocket({
      // url: 'wss://test.enzhico.net/app'
      url: 'wss://mapp.enzhico.net/app'
    })
    that.showLoad()
    that.globalData.localSocket.onOpen(function (res) {
      console.log('WebSocket連接已打開!readyState=' + that.globalData.localSocket.readyState)
      that.hideLoad()
      while (socketMsgQueue.length > 0) {
        var msg = socketMsgQueue.shift();
        that.sendSocketMessage(msg);
      }
    })
    that.globalData.localSocket.onMessage(function(res) {
      that.hideLoad()
      that.globalData.callback(res)
    })
    that.globalData.localSocket.onError(function(res) {
      console.log('readyState=' + that.globalData.localSocket.readyState)
    })
    that.globalData.localSocket.onClose(function (res) {
      console.log('WebSocket連接已關閉!readyState=' + that.globalData.localSocket.readyState)
      that.initSocket()
    })
  },
  //統一發送消息
  sendSocketMessage: function (msg) {
    if (this.globalData.localSocket.readyState === 1) {
      this.showLoad()
      this.globalData.localSocket.send({
        data: JSON.stringify(msg)
      })
    } else {
      socketMsgQueue.push(msg)
    }
  },
  onShow: function(options) {
    if (this.globalData.localSocket.readyState !== 0 && this.globalData.localSocket.readyState !== 1) {
      console.log('開始嘗試連接WebSocket!readyState=' + this.globalData.localSocket.readyState)
      this.initSocket()
    }
  }
})

 

page 頁面 

/**
* 生命周期函數--監聽頁面顯示
*/
onShow: function () {
  var that = this
  app.globalData.callback = function (res) {
   //res  接收websocket onMessage事件返回的數據
  }
}
//向服務器發送數據
app.sendSocketMessage(data: JSON.stringify({});
)

  

 

SocketTask

 這個對象是通過wx.connetSocket(obj)來獲取的,他有一個屬性值readyState,有4個狀態值:

1 CONNECTING:0 連接中

2 OPEN:1 已連接

3 CLOSING:2 關閉中

4 CLOSED:3 已關閉

 剛開始我們使用的做法是全局一個變量socketOpen,用來表示這個socket是否打開,沒有打開就重連,否則就直接調用發送消息接口了。但是經過測試發現網絡不穩定,會出現這個變量沒有得到及時更新一直是true。然后就不再去連接了,但實際上已經斷開了

所以最后就把這個socketOpen變量去掉,直接判斷SocketTask對象的屬性值readyState,如果是1的話就表示直接可用;

 

 

 

基本思路:

1 全局維護一個SocketTask對象,用來表示websocket連接,小程序onShow時判斷是否斷線,是否需要重連

2 同時定義一個全局的回調函數callback回調函數,每個頁面初始化的時候更新這個回調函數,那么每個頁面中收到的返回信息就會執行當前頁面邏輯

3 維護一個消息隊列,所有的消息請求會首先判斷連接是否可用,可用直接send,不可用將消息push到這個隊列中。

4 在app.js的onShow函數中判斷連接是否連上,如果沒有連上就會觸發websocket連接

5 SocketTask對象的onOpen()負責從消息隊列中取出請求消息,並發送這個請求消息

6 SocketTask對象的onMessage() 負責接收返回消息。並調用每個頁面自己定義的回調函數

7 SocketTask對象的onClose() 監聽函數中,觸發websocket連接

 

 

來自:https://blog.csdn.net/h_a_h_ahahah/article/details/80645939

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM