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
相关产品推荐
相关产品推荐

