共计 1362 个字符,预计需要花费 4 分钟才能阅读完成。
WebSocket 二进制数据传输基础
WebSocket 协议支持二进制帧传输,常见于文件分片、实时音视频等场景。二进制数据以 ArrayBuffer 或 Blob 格式传输,与文本数据相比有以下特点:

- 无编码转换,传输效率更高
- 支持任意格式文件传输
- 需要手动处理数据分片重组
在 Apifox 中,WebSocket 接口默认会将二进制响应识别为 16 进制字符串,需要额外处理才能还原为原始文件。
Apifox 处理二进制数据的三大痛点
- 数据格式转换问题 :接收到的二进制数据可能被自动转换为字符串格式
- 分片重组困难 :大文件分片传输时需要维护数据顺序
- 内存消耗控制 :连续接收大文件分片容易导致内存溢出
完整处理方案(Node.js 示例)
// 1. 建立 WebSocket 连接
const WebSocket = require('ws');
const fs = require('fs');
const ws = new WebSocket('ws://your-websocket-url');
const fileChunks = [];
let fileMeta = {};
// 2. 消息接收处理
ws.on('message', (data) => {
// 判断是否为二进制数据
if (data instanceof Buffer) {
// 处理文件元数据(假设首包为 JSON)if (fileChunks.length === 0) {fileMeta = JSON.parse(data.toString());
console.log(` 开始接收文件: ${fileMeta.filename}`);
} else {
// 存储数据分片
fileChunks.push(data);
}
}
});
// 3. 连接关闭时合并文件
ws.on('close', () => {const finalBuffer = Buffer.concat(fileChunks);
fs.writeFileSync(`./downloads/${fileMeta.filename}`, finalBuffer);
console.log(` 文件保存成功: ${fileMeta.filename}`);
});
关键点说明:
- 使用 Buffer 类型处理二进制数据
- 通过首包约定文件元信息
- 使用 Buffer.concat 合并分片
性能优化四要素
-
分块写入磁盘 :避免内存中保存完整文件
// 分块写入示例 const writeStream = fs.createWriteStream('./downloads/large_file.zip'); ws.on('message', (chunk) => {writeStream.write(chunk); }); -
流量控制 :通过 ACK 机制控制发送速率
- 内存监控 :定期检查内存使用情况
- 断点续传 :记录已接收分片位置
生产环境避坑指南
- 数据校验必做 :对每个分片进行 MD5 校验
- 超时重试机制 :设置合理的心跳间隔
- 连接状态管理 :处理异常断开和自动重连
- 日志记录 :详细记录传输过程中的关键事件
实践建议
- 先用小文件测试基本流程
- 逐步增加文件大小测试性能边界
- 实现基础功能后再考虑优化
- 关注 Apifox 控制台的原始数据展示
通过这套方案,我们在实际项目中成功处理了 500MB 以上的视频文件传输。建议读者先从简单的文本文件开始实践,逐步过渡到复杂场景。遇到具体问题时,可以查看 Apifox 的原始数据展示功能辅助调试。
正文完
