收藏
回答

一个关于WebSocket的奇怪BUG

问题模块 框架类型 问题类型 操作系统 操作系统版本 手机型号 微信版本
客户端 小程序 Bug Android Android 10;Hydrogen OS 10.0.4.HD65 OnePlus 7T 7.0.8

这个BUG可能很难通过代码片段进行复现,以下是出问题的代码。

   const io = require('../../../utils/weapp.socket.io.js')

    

   const socket = (this.socket = io(

      'wss://qpjzzs.aibuyun.com/'
    ))
 
    socket.on('connect', () => {
      this.pushMessage("连接成功")
      socket.emit('join', {
        roomId: this.data.roomId,
        openId: this.data.openId,
        userInfo: this.data.userInfo
      });
    })

问题描述:能够顺利连接后端服务器并打印“连接成功”,但是后端需要约30秒才能收到“join”发出的数据。(非常大几率复现,很小几率能够“秒达”)

奇怪的地方:

1、目前测了几个型号的机器(iPhone X、iPhone 6s Plus和荣耀9i),只有OnePlus 7T会出现这个问题,也就是近几天才出现。

2、我尝试卸载并重新安装微信,问题依旧存在。

3、我尝试在别的手机登陆我的微信,不存在这个问题。

4、问题只存在于体验版和线上版,开发工具调试和真机调试都没有问题。

才疏学浅,希望大家能够帮忙看看是哪里出了问题,感激不尽!

最后一次编辑于  11-17
回答关注问题邀请回答
收藏

5 个回答

  • 小程序/小游戏开发-Link
    小程序/小游戏开发-Link
    11-18

    从客户端日志看到的情况是:

    1. 14:36:48.318 收到 connectSocket 调用

    2. 14:36:48.505 抛了 open 事件

    3. 14:37:13.511 收到 send 调用

    所以这里的问题在于前端收到 open 事件之后,等待了 15s 才调用 send 接口。从你贴的代码看到,你是用了 socket.io 这个库。按你的预期,应该是调用了 socket.emit 之后就会去调用底层的 send 接口,但实际上没有。

    具体原因需要你进一步排查,建议不用 socket.io 这个库,直接用原生接口尝试下是否还有这个问题。如果问题不存在了,说明是 socket.io 内逻辑异常;如果问题还存在,再提供日志我们这边定位一下。

    11-18
    赞同
    回复 12
    • 许周潮
      许周潮
      11-18
      好的,我来用原生接口试一下。
      11-18
      回复
    • 习
      11-19回复许周潮
      你好,原生接口有问题吗
      11-19
      回复
    • 许周潮
      许周潮
      11-19回复
      我后端也是socket.io,原生接口连不上,准备换成ws试试。
      11-19
      回复
    • 习
      11-19回复许周潮
      能连上的,只是要加上后缀this.url + "/socket.io/?EIO=3&transport=websocket"
      11-19
      回复
    • 许周潮
      许周潮
      11-19回复
      连上了,但是原生接口发送的消息没有eventName,服务端怎么监听呢?
      11-19
      回复
    查看更多(7)
  • 社区技术运营专员-小柿子
    社区技术运营专员-小柿子
    11-18

    麻烦在手机微信那里上传下日志: 我->设置->帮助与反馈右上角有个上报日志的入口,麻烦提供一下微信号,复现的具体时间点

    11-18
    赞同
    回复 1
    • 许周潮
      许周潮
      11-18
      刚才复现了一下,14点37分,微信号xuzhouchao,日志已上传。
      11-18
      回复
  • JOU.San🤪🤪🤪
    JOU.San🤪🤪🤪
    11-25

    我这边也出现了和你一样的问题,搞死我了,7.0.8安卓客户端就有问题,其他都是正常的。我也不是很想换,因为想用socketio的心跳机制和断线重连机制,楼主后面你怎么解决的啊?

    第二天更新回复:

    这些天我也碰到了和你一样的情况,一开始我也觉得是7.0.8版本的websocket有问题,看了你的问题我第二天决定尝试调试weapp.socket.io了,果然不出所料,分析weapp.socket.io源码发现是因为微信7.0.8版本内会先接收onMessage的open消息,后面才接收onOpen消息(7.0.8以前的版本是onOpen先执行),导致的执行顺序出问题了。
    所以找到问题后就很好改了,在onMessage回调上做一下延迟执行即可,代码如下:

    this._socket.onMessage(data => {
      setTimeout(() => {
        this.onmessage(data)
      }, 0);
    })


    11-25
    赞同
    回复
  • 许周潮
    许周潮
    11-17

    测试进展:

    1、我把OnePlus 7T的微信降级到7.0.7版本后,没有再出现该BUG。

    2、找朋友的OnePlus 7T测试,微信是7.0.8版本,同样出现该BUG。

    3、找朋友的三星S10测试,微信是7.0.8版本,没有出现该BUG。

    所以,是微信和一加手机适配的问题?


    再进展:

    一觉睡醒,OnePlus 7T自动更新到7.0.8,BUG又出现了。

    11-17
    赞同
    回复 2
    • 习
      11-18
      11-18
      回复
    • 许周潮
      许周潮
      11-18回复
      我连接是正常的,服务端能够看到客户端连进来了,客户端也能收到服务端返回的消息,就是连接成功后客户端emit消息延迟。
      11-18
      回复
  • 习
    11-17

    我的小程序也是,这几天登录异常,我什么都没动

    11-17
    赞同
    回复 1
    • 许周潮
      许周潮
      11-17
      我装了个7.0.7版本的微信没有复现该BUG,难道是微信版本的问题?有待测试。
      11-17
      回复
问题标签