微信小程序 Utils丨基于Socket.io.js,實現(xiàn)聊天功能

需求是 client 與 server 以 socket 方式連接對話,場景為 client 發(fā)送一條消息后,server 會返回多條消息且非同時返回。

使用微信原生的 WebSocket 及其提供的 API 后多環(huán)境調(diào)試均為能連接成功,此時考慮在小程序中集成更加成熟且使用方便的 Socket.io.js ,過程簡單使用方便,很贊!

配置服務器域名

微信公眾平臺:https://mp.weixin.qq.com

引入資源文件

本篇配套資源下載:https://pan.baidu.com/s/1PLC5BoBNhM6KtPu1O1DWpg

github最新資源下載:https://github.com/socketio/socket.io

示例代碼

代碼部分包含四個主要方法,分別為:
啟動連接:socketStart()
發(fā)送數(shù)據(jù):socketSendMessage()
接收數(shù)據(jù):socketReceiveMessage()
斷開連接:socketStop()

  • 使用時請將變量socketUrl修改為你的服務器地址
  • 確保你的服務器地址已在微信公眾平臺配置
  • 使用時請將變量sendMessage修改為與服務器約定的格式
// socket 連接插件
const io = require('../../utils/weapp.socket.io.js')
// socket 連接地址
var socketUrl = 'wss://www.貴司服務器地址.com'
// socket 狀態(tài)更新
var socketMessage = ''
// 上下文對象
var that


Page({

  /**
   * 生命周期函數(shù)--監(jiān)聽頁面加載
   */
  onLoad: function (options) {
    that = this
    this.socketStart();
  },

  /**
   * 啟動socket
   */
  socketStart: function () {

    // 設置socket連接地址 socketUrl
    const socket = (this.socket = io(
      socketUrl,
    ))

    socket.on('connect', () => {
      this.setData({ socketMessage: socketMessage += 'SOCKET連接成功 → \n\n' })

      // 此處修改為與server約定的數(shù)據(jù)、格式
      var sendMessage = '{"token":"v3jsoc8476shNFhxgqPAkkjt678","client":"發(fā)送內(nèi)容"}'
      this.socketSendMessage(sendMessage);
    })

    socket.on('connect_error', d => {
      this.setData({ socketMessage: socketMessage += 'SOCKET連接失敗 → \n\n' })
    })

    socket.on('connect_timeout', d => {
      this.setData({ socketMessage: socketMessage += 'SOCKET連接超時 → \n\n' })
    })

    socket.on('disconnect', reason => {
      this.setData({ socketMessage: socketMessage += 'SOCKET連接斷開 → \n\n' })
    })

    socket.on('reconnect', attemptNumber => {
      this.setData({ socketMessage: socketMessage += 'SOCKET正在重連 → \n\n' })
    })

    socket.on('reconnect_failed', () => {
      this.setData({ socketMessage: socketMessage += 'SOCKET重連失敗 → \n\n' })
    })

    socket.on('reconnect_attempt', () => {
      this.setData({ socketMessage: socketMessage += 'SOCKET正在重連 → \n\n' })
    })

    socket.on('error', err => {
      this.setData({ socketMessage: socketMessage += 'SOCKET連接錯誤 → \n\n' })
    })

    socket.on('message', function (d) {
      this.setData({ socketMessage: socketMessage += '服務器返回數(shù)據(jù) → \n\n' })
      that.socketReceiveMessage(d)
    })

  },

  /**
   * 斷開socket
   */
  socketStop: function () {
    if (this.socket) {
      this.socket.close()
      this.socket = null
    }
  },

  /**
   * 發(fā)送消息
   */
  socketSendMessage: function (sendStr) {
    if (this.socket) {
      this.setData({ socketMessage: socketMessage += '向服務器發(fā)送數(shù)據(jù) → ' + sendStr + '\n\n'})
      this.socket.emit('message', sendStr);
    }
  },

  /**
   * 接收消息
   */
  socketReceiveMessage: function (receivedStr) {
    this.setData({ socketMessage: socketMessage += '服務器返回數(shù)據(jù) → ' + receivedStr + '\n\n'})
    this.socketStop();
  },
})

聊天功能實現(xiàn)效果


最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容