评论

WebSocket + Stomp 断连

WebSocket + Stomp 苹果真机连上之后断连,返回 code: 1006, reason: "" 原因查找

测试手机: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)

})

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

最后一次编辑于  2021-03-23  
点赞 5
收藏
评论

8 个评论

  • 哄哄
    哄哄
    03-01

    问题解决,十分感谢!

    03-01
    赞同
    回复
  • 火然
    火然
    2023-09-06

    亲测有效👍👍👍

    2023-09-06
    赞同
    回复
  • 💭2097
    💭2097
    2022-05-26

    牛逼!成了!

    2022-05-26
    赞同
    回复
  • 2022-05-02

    牛逼!!!

    2022-05-02
    赞同
    回复
  • 阿飞
    阿飞
    2022-03-31

    解决了,膜拜

    2022-03-31
    赞同
    回复
  • Harold
    Harold
    2022-02-18

    解决了,感谢!

    2022-02-18
    赞同
    回复
  • young
    young
    2021-11-26

    666

    2021-11-26
    赞同
    回复
  • 丑丑男
    丑丑男
    2021-07-28

    完全没问题 我也是发现了源码stompjs里用真机的话frame里的集合是空的。。。用模拟器就有,万万没想到ios 缺少 0x00 导致解析失败 的原因。。。囧

    完美解决了问题啊太6了

    2021-07-28
    赞同
    回复
登录 后发表内容