个人案例
- 药管事适老版
方便于老年人使用的产品
药关爱扫码体验
- 有啦拼字幕
字幕拼图软件
有啦拼字幕扫码体验
- WebSocket + Stomp 断连
测试手机: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 - 有啦拼字幕
字幕拼图软件
2020-02-25