websocket无法接收二进制数据

  • Creator 版本: 3.8.4

  • 目标平台: 微信小游戏开发工具中的预览,真机扫二维码运行

  • 重现方式:任意websocket

  • 之前哪个版本是正常的: 未知,由3.8.3版本构建的项目直接转换而来

  • 手机型号: oppo

微信小游戏开发工具中的模拟器能正常接收二进制数据,但使用“预览”功能真机扫二维码运行时,websocket永远接收到的是空字符串(已确保服务器发送了二进制数据且使用已备案的wss域名)。

样例代码如下:

this.ws = new WebSocket(url);
this.ws.binaryType = “arraybuffer”;

this.ws.onopen = ev => {
};

this.ws.onmessage = ev => {
if (typeof ev.data === ‘string’) {
// 微信小程序开发者工具预览功能永远走的这里,而且是空字符串
// 处理文本消息
console.log(‘Received a text message’, ev.data);
} else {
// 处理二进制消息
let buffer = ev.data;
let view = new Uint8Array(buffer);
console.log(‘Received bytes:’, view);
// 进一步处理字节数据
}
};

你的url是怎么写的

url是 wss://域名/websocket

确定连上了吗?主动发消息试一试服务端能不能接收?

确定连上了,因为一直在接收心跳包,但接收到的数据就是空字符串,h5和微信开发者工具模拟器都能正常接收,一到真机上就不行。

wss配置到微信后台了么

配了的,不然开发者工具模拟器都跑不通。

你确定应该这么用吗?然后先判断一下收到的长度吧

前面有个typeof,用于获取 ev.data 的数据类型,所以是有用的,目前在PC版微信中也能正常获取二进制数据,就是手机中永远是空字符串

打印一下当时的数据长度也是 0?
因为你是判断是否是字符串的 不能判断是字符串 但长度不一定是0的 因为类型判断可能有问题本身

感谢关注,字符串长度的确也是0

不是字符串长度,而是说数据包的长度 不是一个概念,是说你这次接受到数据本身的长度

麻烦帮忙看看这段代码,在pc版微信小游戏体验版中,这段代码也是运行正常的,会获取到字节数据。

数据本身就是一个空字符串,不是ArrayBuffer,也不是Blob,问题就在这里。

我先建议 你把这个长度 放到这个判断前 显示一下 至少不应该为0 ,否则整个数据传输都有问题了, 如果不为0 那就是你应用层包结构定义和组织问题了

console.log(“aaaaaa”, ev.data, ev.data.length);

这么输出的,在模拟器和pc版微信小游戏体验版运行中,ev.data 都打印出是一个ArrayBuffer对象,而在手机下却显示是一个字符串。

微信图片_20241108223109

这样啊 把这个判断去掉 然后运行

最早的代码就是没有这个判断的,一样的问题 :joy:

感谢您的耐心解答,已经找到问题了,前端代码写法有问题
微信图片_20241108230006
红框部分原来错误的写法用了 ba.bytes (一个Uint8Array对象),而websocket在真机上必须严格使用ArrayBuffer对象。

1赞

websocket连接不要加参数,否则连不上。 :rofl: