小程序连接webscoket实现即时通讯

本文介绍了如何在微信小程序中利用WebSocket连接 webscroket 实现即时通讯功能,特别是在拍卖项目中的实时竞拍。通过封装公共方法,实现了连接、发送消息、关闭连接及心跳检测等功能。在页面加载时连接WebSocket,并在卸载时关闭,确保了通讯的稳定性和资源的有效管理。
摘要由CSDN通过智能技术生成

小程序连接webscroket实现即时通讯

最近在考虑使用webscroket实现拍卖项目的即时竞拍通讯,需要进入当前页面连接webscroket,退出时回收,于是就想到封装一个简单便捷的公共方法,话不多说直接上代码

// socket已经连接成功
var socketOpen = false
// socket已经调用关闭function
var socketClose = false
// socket发送的消息队列
var socketMsgQueue = []
// 判断心跳变量
var heart = ''
// 心跳失败次数
var heartBeatFailCount = 0
// 终止心跳
var heartBeatTimeOut = null;
// 终止重新连接
var connectSocketTimeOut = null;

var i=1
const url ='';//websocket链接地址,需要在微信后台的wss配置
var webSocket = {
  //开始连接
  connectSocket: function () {
    socketOpen = false
    socketClose = false
    socketMsgQueue = []

    wx.connectSocket({
      url: url,
      // header: { 'ticket': wx.getStorageSync('token')},
      success: function (res) {
        if (res) {
          // 成功回调
          // console.log(res)
          // options.success && options.success(res);
        }
      },
      fail: function (res) {
        if (res) {
          // 失败回调
          // options.fail && options.fail(res);
        }
      }
    })
  },
 
  /**
   * 通过 WebSocket 连接发送数据
   * @param {options}
   *   data    String / ArrayBuffer    是    需要发送的内容
   *   success    Function    否    接口调用成功的回调函数
   *   fail    Function    否    接口调用失败的回调函数
   *   complete    Function    否    接口调用结束的回调函数(调用成功、失败都会执行)
   */
  sendSocketMessage: function (options) {
    if (socketOpen) {
      wx.sendSocketMessage({
        data: options.msg,
        success: function (res) {
          if (options) {
            options.success && options.success(res);
          }
        },
        fail: function (res) {
          if (options) {
            options.fail && options.fail(res);
          }
        }
      })
    } else {
      socketMsgQueue.push(options.msg)
    }
  },
 
  /**
   * 关闭 WebSocket 连接。
   * @param {options}
   */
  closeSocket: function (options) {
    if (connectSocketTimeOut) {
      clearTimeout(connectSocketTimeOut);
      connectSocketTimeOut = null;
    }
    socketClose = true;
    var self = this;
    self.stopHeartBeat();
    wx.closeSocket({
      success: function (res) {
        console.log('WebSocket 已关闭!');
        if (options) {
          options.success && options.success(res);
        }
      },
      fail: function (res) {
        if (options) {
          options.fail && options.fail(res);
        }
      }
    })
  },
 
  // 方法内收到消息回调
  onSocketMessageCallback: function (msg) {
 
  },
 
  // 开始心跳
  startHeartBeat: function () {
    console.log('socket开始心跳')
    var self = this;
    heart = 'heart';
    self.heartBeat();
  },
 
  // 结束心跳
  stopHeartBeat: function () {
    console.log('socket结束心跳')
    var self = this;
    heart = '';
    if (heartBeatTimeOut) {
      clearTimeout(heartBeatTimeOut);
      heartBeatTimeOut = null;
    }
    if (connectSocketTimeOut) {
      clearTimeout(connectSocketTimeOut);
      connectSocketTimeOut = null;
    }
  },
 
  // 心跳
  heartBeat: function () {
    var self = this;
    if (!heart) {
      return;
    }
    self.sendSocketMessage({
      msg: JSON.stringify({
        'messageType':1//心跳
      }),
      success: function (res) {
        console.log('socket心跳成功');
        if (heart) {
          heartBeatTimeOut = setTimeout(() => {
            self.heartBeat();
          }, 60000);
        }
      },
      fail: function (res) {
        console.log('socket心跳失败');
        if (heartBeatFailCount > 2) {
          // 重连
          self.connectSocket();
        }
        if (heart) {
          heartBeatTimeOut = setTimeout(() => {
            self.heartBeat();
          }, 60000);
        }
        heartBeatFailCount++;
      },
    });
  }
}
 
// 监听WebSocket连接打开事件。callback 回调函数
wx.onSocketOpen(function (res) {
  console.log('WebSocket连接已打开!')
  // 如果已经调用过关闭function
  if (socketClose) {
    webSocket.closeSocket();
  } else {
    socketOpen = true
    for (var i = 0; i < socketMsgQueue.length; i++) {
      webSocket.sendSocketMessage(socketMsgQueue[i])
    }
    socketMsgQueue = []
    webSocket.startHeartBeat();
  }
})
 
// 监听WebSocket错误。
wx.onSocketError(function (res) {
  console.log('WebSocket连接打开失败,请检查!', res)
})
 
// 监听WebSocket接受到服务器的消息事件。
wx.onSocketMessage(function (res) {
  console.log('收到服务器内容:' + res.data)
  //
  if (res.data =='SUCCESS'||res.data=="连接成功"){
     return;
  }
  //接收服务器返回内容,调用页面回调函数接收
  webSocket.onSocketMessageCallback(res.data)
})
 
// 监听WebSocket关闭。
wx.onSocketClose(function (res) {
  console.log('WebSocket 已关闭!')
 	//主动关闭时,不再连接;被动关闭时,持续连接
  if (!socketClose) {
    let time = Math.pow(2, i)
    i++
    if (time==8){
      i=1
    }
    clearTimeout(connectSocketTimeOut)
    connectSocketTimeOut = setTimeout(() => {
      webSocket.connectSocket();
    }, time*1000);
  }
})
 
module.exports = webSocket;

在需要的页面引入
import webSocket from ‘…/…/…/…/utils/webscoket’;
后连接(将回调函数绑定为当前函数)
webSocket.onSocketMessageCallback = this.onSocketMessageCallback;//绑定回调函数webSocket.connectSocket();//连接webscoket
页面销毁时回收即可
/**

  • 生命周期函数–监听页面卸载
    */
    onUnload: function () {
    //websocket
    webSocket.closeSocket();
    }
    运行结果看图
    连接成功
    连接在这里插入图片描述
    退出成功
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebSocket是一种支持双向通信的网络协议,可以在客户端和服务器之间建立实时的、持久的连接。它通过在HTTP协议升级到WebSocket协议的过程中握手来建立连接,并使用类似Socket的API来进行通信。 要实现WebSocket即时通讯,需要以下步骤: 1. 客户端发起WebSocket连接请求:客户端通过发送HTTP请求到服务器来建立WebSocket连接。请求头中需要包含特定的字段来指示升级到WebSocket协议。 2. 服务器接受WebSocket连接请求:服务器接收到客户端的WebSocket连接请求后,会返回特定的响应头,表示成功升级到WebSocket协议。 3. 双向通信:建立WebSocket连接后,客户端和服务器可以通过发送消息来进行实时的双向通信。客户端和服务器都可以主动发送消息,并且对方可以通过事件监听来接收消息。 4. 关闭连接:当通信完成或者需要关闭连接时,客户端或服务器可以发送关闭帧来结束WebSocket连接。 对于客户端来说,可以使用浏览器提供的JavaScript WebSocket API来实现WebSocket的功能。具体步骤如下: 1. 创建WebSocket对象:在JavaScript中创建一个WebSocket对象,指定要连接的服务器地址。 2. 监听事件:通过监听WebSocket对象的事件来接收服务器发送的消息。常用的事件有onopen(连接建立)、onmessage(收到消息)、onclose(连接关闭)和onerror(连接错误)。 3. 发送消息:使用WebSocket对象的send()方法来向服务器发送消息。 对于服务器端来说,可以使用各种编程语言提供的WebSocket库来实现WebSocket的功能。具体步骤如下: 1. 接受连接:服务器端需要监听客户端发起的连接请求,并接受连接。 2. 响应升级请求:服务器端需要返回特定的响应头来表示成功升级到WebSocket协议。 3. 处理消息:服务器端可以通过监听接收到的消息来处理客户端发送的消息,并根据需求进行相应的操作。 4. 发送消息:服务器端可以使用相应的方法来向客户端发送消息。 以上就是使用WebSocket实现即时通讯的基本步骤,具体实现方式会根据具体的编程语言和框架而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值