You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:22:42