uni-app uni.sendSocketMessage 中data内容处理时,内容发送失败
uni-app uni.sendSocketMessage 中data内容处理时,内容发送失败
示例代码:
uni.sendSocketMessage({
data: JSON.stringify(msg),
fail: (res) => {},
complete: (res) => {}
})
操作步骤:
uni.sendSocketMessage({
data: JSON.stringify(msg),
fail: (res) => {},
complete: (res) => {}
})
预期结果:
websocket发送成功
实际结果:
连接失败 没有连接上服务器
bug描述:
sendSocketMessage 发送的内容过长的时候,发送失败,不能够连接到服务器
发送的内容如下
```json
{
"UserPresentID": null,
"UserIDTo": false,
"MessageType": 0,
"MsgToType": 1,
"MessageID": "1632300307802ChatFrontID",
"IsVIP": false,
"UserTypeID": null,
"MessageContent": "2.修复 uni.sendSocketMessage 无法发送某些 bytebuffer 数据的Bug 3.修复 nvue list/waterfall 组件底部使用 loading 加载更多时,无法正常触发[@loading](/user/loading) 事件的Bug 4.修复 nvue list 组件[@scroll](/user/scroll) 事件返回参数 contentOffset.y 值域不正确的Bug 5.修复 nvue input 组件设置 type 为 digit/number 时弹出键盘类型不正确的...2.修复 uni.sendSocketMessage 无法发送某些 bytebuffer 数据的Bug 3.修复 nvue list/waterfall 组件底部使用 loading 加载更多时,无法正常触发[@loading](/user/loading) 事件的Bug 4.修复 nvue list 组件[@scroll](/user/scroll) 事件返回参数 contentOffset.y 值域不正确的Bug 5.修复 nvue input 组件设置 type 为 digit/number 时弹出键盘类型不正确的...",
"UserFromName": "DDDD",
"UserFromPhoto": "img/202107/210705151427297_6441.png",
"UserIDFrom": 2,
"MessageDeliverID": "D16323003078026093",
"SendStatus": "load",
"BubbleImageUrl": "",
"BubbleFontColor": "",
"CreateTime": "2021-09-22T08:45:07.803Z",
"GroupIDTo": 1,
"IsMine": true
}
### 项目信息
| 项目信息 | 详情 |
|----------------|----------------|
| 产品分类 | uniapp/App |
| PC开发环境 | Windows |
| PC开发环境版本 | Windows 11 |
| 开发工具 | HBuilderX |
| 工具版本 | 3.2.7 |
| 手机系统 | Android |
| 手机系统版本 | Android 10 |
| 手机厂商 | vivo |
| 手机机型 | IQOO NEO3 |
| 页面类型 | vue |
| 打包方式 | 云端 |
| 项目创建方式 | HBuilderX |
更多关于uni-app uni.sendSocketMessage 中data内容处理时,内容发送失败的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于uni-app uni.sendSocketMessage 中data内容处理时,内容发送失败的实战教程也可以访问 https://www.itying.com/category-93-b0.html
从你的描述来看,问题核心是 uni.sendSocketMessage 在发送较长的 data 内容时失败,并提示“连接失败 没有连接上服务器”。这个错误信息有一定误导性,因为问题通常不在于连接本身,而在于发送的数据。
根据你提供的 MessageContent 字段内容(包含大量重复的修复日志文本),数据体量确实可能很大。在 WebSocket 通信中,尤其是在移动端和某些服务器配置下,单次发送的数据包大小是有限制的。超过这个限制,底层可能会直接发送失败。
排查和解决建议如下:
-
检查数据大小:首先,将你的
msg对象通过JSON.stringify转换成字符串后,使用msgString.length或new Blob([msgString]).size粗略计算其字节大小。如果数据量过大(例如超过几十KB甚至更大),这很可能是根本原因。 -
分片发送:如果必须发送大量数据,标准的解决方案是实现数据分片。你需要将长字符串或二进制数据分割成多个较小的片段(chunks),然后通过循环多次调用
uni.sendSocketMessage发送。接收方则需要有对应的逻辑来拼接这些片段。这需要你和服务器端协商好分片协议(例如,在数据包中添加序列号、总包数等标识字段)。 -
压缩数据:在发送前,可以考虑对数据进行压缩。例如,可以将
JSON.stringify后的字符串使用如pako等库进行 gzip 压缩(转换为 ArrayBuffer 或 Base64),然后再发送。这能显著减少传输体积。同样,服务器端需要解压。 -
优化数据结构:检查你的
msg数据是否包含冗余信息。例如,你示例中MessageContent字段包含了大段重复的文本,这极不必要。应确保发送的数据是精简的。 -
验证连接状态:在调用
sendSocketMessage之前,确保 WebSocket 连接已成功建立(即uni.onSocketOpen回调已触发)。你可以设置一个状态标志来管理。 -
服务器端限制:联系服务器端开发人员,确认服务器对 WebSocket 单帧或单消息的大小是否有限制。这个限制可能需要调整。
代码调整示例(思路):
// 假设这是你的长数据
let longData = JSON.stringify(msg);
// 1. 简单分片示例(需与服务器约定格式)
const CHUNK_SIZE = 4096; // 例如每片4KB
const totalChunks = Math.ceil(longData.length / CHUNK_SIZE);
for (let i = 0; i < totalChunks; i++) {
const chunk = longData.slice(i * CHUNK_SIZE, (i + 1) * CHUNK_SIZE);
const packet = {
type: 'chunk',
index: i,
total: totalChunks,
data: chunk
};
uni.sendSocketMessage({
data: JSON.stringify(packet),
fail: (err) => {
console.error('发送分片失败:', i, err);
}
});
}

