收藏
回答

websockect连接成功后readyState却持续6秒内还是0,目前应如何判断ws是否连接成功

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug wx.connectSocket 微信iOS客户端 7.0.14 2.11.0

我们的小程序保障ws连接的机制是:每6秒会发送一次心跳,如果发送心跳成功后判断该ws的readyState同时为1,则断定为ws是连通的,如果发送失败,或发送成功但是readyState不为1则都算失败,将会关闭ws,重新发起连接。

后台日志(下方代码块),以及小程序实时日志(下方截图)可看出客户在16:52::18(小程序后台日志16:52::17秒)成功连接,readystate不等于1并在6秒内仍不为,故在下一次心跳则断开重连。

{
  "timestamp" : "2020-05-11T16:52:18.531+08",
  "level" : "INFO",
  "thread" : "nioEventLoopGroup-3-2",
  "logger" : "websocket",
  "message" : "医生端小程序已连接, currentDoctor: CurrentDoctor{userId=1059}, ChannelId: 00163efffe0dd1cc-00007c72-0003436c-a07c3fec4a4defde-fd860c6a",
  "context" : "default"
}{
  "timestamp" : "2020-05-11T16:52:24.306+08",
  "level" : "INFO",
  "thread" : "nioEventLoopGroup-3-2",
  "logger" : "heartbeat",
  "message" : "接收客户端心跳, HB: HB_2fd7016c-b1d5-467b-b537-7f0cecdcee35, ChannelId: 00163efffe0dd1cc-00007c72-0003436c-a07c3fec4a4defde-fd860c6a",
  "context" : "default"
}{
  "timestamp" : "2020-05-11T16:52:24.391+08",
  "level" : "WARN",
  "thread" : "nioEventLoopGroup-3-2",
  "logger" : "websocket",
  "message" : "医生端小程序已断开, currentDoctor: CurrentDoctor{userId=1059}, ChannelId: 00163efffe0dd1cc-00007c72-0003436c-a07c3fec4a4defde-fd860c6a",
  "context" : "default"
}


心跳代码

//  心跳定时器启动
   startHBTimer () {
    clearInterval(this._timer)
    this._timer = setInterval(() => {
      this.sendHBMsg()
    }, 6000)
  }
// 发送心跳
  sendHBMsg () {
    let self = this
    const loginInfo = wx.getStorageSync('loginInfo')
    if (!loginInfo) { return }
    self._socketTask.send({
      data`HB_${loginInfo.token}_${loginInfo.name}`,
      success(e) => {
        if (self._socketTask.readyState * 1 === 1) {
          wx.hideNavigationBarLoading()
        } else {
          self.sendFailHandler(self)
          wxLog.warn('sendHBMsg success but readyStateCode is not open''&readyStateCode=' + self._socketTask.readyState + '&device=' + JSON.stringify(wx.getStorageSync('systemDetailInfo')))
        }
      },
      fail(res) => {
        self.sendFailHandler(self)
        wxLog.warn(res, 'sendHBMsg fail&readyStateCode=' + self._socketTask.readyState + '&device=' + JSON.stringify(wx.getStorageSync('systemDetailInfo')))
       
      }
    })
  }
  sendFailHandler (self) {
    wx.showNavigationBarLoading()
    self.createConnection()
  }


目前readyState这个状态是不可用的状态吗?那客户端应如何判断ws是否连接成功状态

回答关注问题邀请回答
收藏

3 个回答

  • Admin ²º²³
    Admin ²º²³
    2020-05-12

    谢邀:

    readyState你是在哪看到这个玩意的哈?官方文档上我没找到呢,我小程序websocket里也没用到这个

    我是59秒一次心跳,

    onSocketOpen时设置自定义标志为成功

    onSocketError,重连,设置标志为失败

    2020-05-12
    有用 1
    回复 5
  • 阿白
    阿白
    2021-09-13

    我也遇到了这个问题,再息屏一段时间后,进入游戏,readystate 一直是 0。而且这个问题复现还不好复现,有时候遇到,有时候又是好的。

    2021-09-13
    有用
    回复 3
    • 阿白
      阿白
      2021-09-13
      就是readyState的状态问题。现在还没找到在什么情况下一定发生。
      2021-09-13
      回复
    • Geefib
      Geefib
      2021-09-18
      readyState不太准,我们还是用心跳控制吧
      2021-09-18
      回复
    • 阿白
      阿白
      2021-09-18回复Geefib
      是的,后来用心跳解决了。
      2021-09-18
      回复
  • 晓
    2020-05-12

    websocket有个连接成功的回调,SocketTask.onOpen(function callback)

    监听 WebSocket 连接打开事件

    ,如果能走到这里,说明连接成功了

    2020-05-12
    有用
    回复 6
    • Geefib
      Geefib
      2020-05-12
      ws比较容易断,之前测试过断的时候不一定会触发onclose
      2020-05-12
      回复
    • Geefib
      Geefib
      2020-05-12
      目前onopen也有打印日志,从前端日只看没触发onopen,但是心跳可以正常发出,没报错
      2020-05-12
      回复
    • Geefib
      Geefib
      2020-05-12
      2020-05-12
      回复
    • 晓
      2020-05-12回复Geefib
      onOpen只会在首次连接成功后触发一次,发心跳包不会触发onOpen的,只会触发onMessage
      2020-05-12
      回复
    • Geefib
      Geefib
      2020-05-12回复
      恩恩,心跳失败会重连的
      2020-05-12
      回复
    查看更多(1)
登录 后发表内容
问题标签