WebSocket + Stomp 断连
发布于 3 年前 作者 lcao 2437 次浏览 来自 分享

测试手机:iphone se2

手机软件版本:14.4 小程序调试基础库:2.15.0 (其实高版本低版本都试了个遍)

问题描述:Android 真机和微信开发者工具上 webSocket + stomp 可以成功收发数据,但是 IOS 真机不行,连上了1分钟左右自动断连。返回错误 code:1006. reason:"" 。(这个问题是之后出的,刚写完的时候是 Android / IOS 都可以的)

问题解决:

wx.onSocketMessage(function (res) {

// ios 缺少 0x00 导致解析失败

if (res && res.data) {

let value = res.data;

let code = value.charCodeAt(value.length - 1);

if (code !== 0x00) {

value += String.fromCharCode(0x00);

res.data = value;

}

}

ws.onmessage(res)

})

以下是排查的过程:(省略了许多,忘见谅,后续有时间会写个 demo)

代码我就不贴了,websocket + stomp 代码网上的基本一样。

我简述一下相关逻辑:就是使用微信的 WebSocket API 与服务器的 URL 连上的同时调用 Stomp 的 onopen( ) 方法,然后将微信接收到的服务器信息通过

Stomp 的 onmessage( ) 方法传给 Stomp ,Stomp 发送消息也是通过微信 API 的 wx.sendSocketMessage () 方法发送给服务器。Stomp 只是与服务器约定的一种文本格式,里面按照规则对文本进行了处理。

这是 iphone 真机调试的日志截图:

微信的 WebSocket API 是没有问题的,成功的接收到了服务器的信息,161648094400 - 161648088300 = 61000 毫秒 ,服务器与客户端一分钟没有交互导致 WebSocket 自动断连。

这是小程序开发工具的日志截图:

我小程序开发工具日志与苹果真机调试日志对比发现,苹果真机 WebSocket 收到的服务器信息都少了末尾的截图第 1、3 的 0 这个字符,frames (也就是 2 ) 这一行日志,解析出一个长度为 2 的数组,数组最后一个值就是字符编码为0的值,而苹果真机的没有。

下面是一部分 Stomp 源码:

这个 Byte 的 NULL 就是对应收到服务器消息末尾的字符编码为0的值。

下面是 onmessage() 的部分源码:

下面是 unmarshall() 方法

所以解决这个苹果真机断连的办法就是在微信 API 的 onSocketMessage 方法里传给 Stomp 前将 0x00 这个字符补上,以下是我的解决办法:

wx.onSocketMessage(function (res) {

// ios 缺少 0x00 导致解析失败

if (res && res.data) {

let value = res.data;

let code = value.charCodeAt(value.length - 1);

if (code !== 0x00) {

value += String.fromCharCode(0x00);

res.data = value;

}

}

ws.onmessage(res)

})

如有错误,期望不惜赐教。

回到顶部