一个关于WebSocket的奇怪BUG
发布于 6 年前 作者 xiuyingwu 3969 次浏览 来自 官方Issues

这个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、问题只存在于体验版和线上版,开发工具调试和真机调试都没有问题。

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

5 回复

测试进展:

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又出现了。

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

我这边也出现了和你一样的问题,搞死我了,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);
})

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

  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 内逻辑异常;如果问题还存在,再提供日志我们这边定位一下。

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

回到顶部