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

Node.js Net服务器接收消息被截断,如何提升长度限制?

解决Node.js TCP服务器数据截断问题

你的问题本质不是“消息长度限制”,而是TCP是流式传输协议——数据会被拆分成多个TCP分段发送,net模块的data事件会在每个分段到达时触发,你看到的“截断”只是单次事件拿到的分块数据,而非完整消息。

解决方案:为每个连接维护数据缓冲区,拼接分块数据

修改服务器代码,为每个客户端连接创建独立的缓冲区,将每次data事件收到的数据拼接起来,直到连接关闭或提取到完整消息:

const net = require("net");
const port = 7070;
const host = "0.0.0.0"; // 改为0.0.0.0,允许AWS服务器外部访问(原127.0.0.1仅本地可访问)

const server = net.createServer();
server.listen(port, host, () => {
  console.log(`TCP Server is running on ${host}:${port}.`);
});

server.on("connection", function (sock) {
  // 为当前连接初始化数据缓冲区
  let receiveBuffer = Buffer.from([]);

  sock.on("data", function (chunk) {
    // 将新收到的分块数据拼接到缓冲区
    receiveBuffer = Buffer.concat([receiveBuffer, chunk]);
    console.log(`已接收数据总长度:${receiveBuffer.length}`);
  });

  sock.on("end", function () {
    // 客户端关闭连接时,输出完整接收的数据
    console.log("完整数据内容:", receiveBuffer.toString());
    receiveBuffer = null; // 清理缓冲区
  });

  sock.on("error", function (err) {
    console.error("连接异常:", err);
    receiveBuffer = null;
  });
});

进阶处理:提取完整业务消息

如果你的业务有明确的消息边界,可以在data事件中主动拆分缓冲区,提取完整消息:

  • 换行符分隔:适合文本类消息,每次收到数据后按\n拆分缓冲区,处理已完成的消息,剩余部分留在缓冲区等待后续数据
  • 固定长度:如果每条消息长度固定,每次检查缓冲区长度是否达到阈值,达到则提取对应长度的内容
  • 头部带长度:消息开头用固定字节标识消息总长度,先读取长度再提取对应内容

额外注意

原代码中host设为127.0.0.1会导致AWS服务器上的服务仅能本地访问,外部客户端无法连接,必须改为0.0.0.0绑定所有可用网卡。

内容的提问来源于stack exchange,提问作者Ahmed Mohsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:17:29