这个BUG可能很难通过代码片段进行复现,以下是出问题的代码。
const io = require('../../../utils/weapp.socket.io.js')
'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、问题只存在于体验版和线上版,开发工具调试和真机调试都没有问题。
才疏学浅,希望大家能够帮忙看看是哪里出了问题,感激不尽!
测试进展:
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); }) |
从客户端日志看到的情况是:
14:36:48.318 收到 connectSocket 调用
14:36:48.505 抛了 open 事件
14:37:13.511 收到 send 调用
所以这里的问题在于前端收到 open 事件之后,等待了 15s 才调用 send 接口。从你贴的代码看到,你是用了 socket.io 这个库。按你的预期,应该是调用了 socket.emit 之后就会去调用底层的 send 接口,但实际上没有。
具体原因需要你进一步排查,建议不用 socket.io 这个库,直接用原生接口尝试下是否还有这个问题。如果问题不存在了,说明是 socket.io 内逻辑异常;如果问题还存在,再提供日志我们这边定位一下。