Socket.io传输二进制数据时冗余{_placeholder:true,num:0}问题求助
Socket.io发送二进制数据冗余{_placeholder:true,num:0}问题解决方法
发送二进制数据时,Socket.io默认会将二进制内容包装成带{_placeholder:true,num:0}的对象,即便使用schemapack编码仍出现该问题,可按以下步骤解决:
1. 两端统一配置schemapack parser
Socket.io默认用JSON parser处理数据,会自动包装二进制。必须在服务端和客户端都指定使用SchemaPackParser,才能让二进制数据按自定义schema传输,避免默认包装。
服务端配置
先安装依赖:
npm install socket.io-parser schemapack
修改Socket.io初始化代码:
const { Server } = require('socket.io'); const { SchemaPackParser } = require('socket.io-parser'); const schemapack = require('schemapack'); // 创建IO实例时指定parser const io = new Server({ parser: new SchemaPackParser(schemapack) }); // 编码并发送数据(保留原有的编码逻辑) const resultObj = { body: message, user: user.name, own: user.id }; const resultObjSchema = schemapack.build({ body: 'string', user: 'string', own: 'uint8' }); const buffer = resultObjSchema.encode(resultObj); // 发送编码后的buffer socket.emit('message', buffer);
客户端配置
浏览器端示例(需引入对应依赖):
import { io } from 'socket.io-client'; import { SchemaPackParser } from 'socket.io-parser'; import schemapack from 'schemapack'; // 连接时指定parser const socket = io({ parser: new SchemaPackParser(schemapack) }); // 接收时解码数据 const resultObjSchema = schemapack.build({ body: 'string', user: 'string', own: 'uint8' }); socket.on('message', (buffer) => { const data = resultObjSchema.decode(buffer); // 处理解码后的数据 });
2. 备选方案:直接发送纯二进制
若配置parser后仍有问题,可尝试跳过Socket.io的事件封装,直接发送纯Buffer:
// 用send方法发送纯二进制 socket.send(buffer); // 客户端接收 socket.on('message', (buffer) => { // 直接处理buffer或解码 });
或者在emit时强制标记为二进制传输:
socket.emit('message', buffer, { binary: true });
内容的提问来源于stack exchange,提问作者Ugur Abbasov
相关产品推荐
相关产品推荐

