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

Node.js TCP客户端获取数据出现多余换行问题排查求助

Node.js TCP客户端数据出现多余换行的原因及解决方法

问题原因

  • TCP流的分片特性:TCP是基于流的传输协议,服务器发送的数据会被拆分成多个TCP分段传输。Node.js的net.Socket对象会在每收到一段数据时触发一次data事件,你当前的代码每次触发就直接打印数据,导致原本连续的内容被拆分成多段显示,看起来像是出现了多余换行。而Putty会将所有接收的数据缓冲拼接完成后再输出,所以显示的是完整无多余换行的内容。
  • 代码中console.log本身会在输出末尾添加换行符,每次data事件触发时打印,相当于给每一段分片数据都额外添加了换行,进一步放大了这个问题。

解决方法

需要将多次data事件接收的分片数据拼接起来,直到收到完整的数据包(根据你和服务器约定的协议,比如以特定字符、固定长度或换行符作为结束标记),再进行处理和打印。

修正后的代码示例:

const net = require('node:net');
const client = net.createConnection({ port: 1024 }, () => {
  console.log('connected to server!');
  client.write('world!\r\n');
});

// 用于拼接分片数据的缓冲区
let receivedData = '';

client.setEncoding('utf8');

client.on('data', (data) => {
  receivedData += data;
  // 假设服务器以换行符作为每个数据包的结束标记,可根据实际协议调整
  while (receivedData.includes('\n')) {
    const endIndex = receivedData.indexOf('\n');
    // 提取完整的数据包
    const completePacket = receivedData.slice(0, endIndex + 1);
    // 处理并打印完整数据
    console.log('完整数据:', completePacket.trim());
    // 更新剩余未处理的数据
    receivedData = receivedData.slice(endIndex + 1);
  }
});

client.on('end', () => {
  // 处理最后剩余的未完整数据
  if (receivedData) {
    console.log('剩余数据:', receivedData.trim());
  }
  console.log('disconnected from server');
});
  • 上述代码通过receivedData变量拼接所有分片数据,再根据协议约定的结束符(示例中为\n)拆分出完整数据包后处理,避免了分片显示导致的多余换行问题。
  • 如果你的服务端协议不是用换行符作为结束标记,需要根据实际情况调整判断完整数据包的逻辑(比如固定长度、特定结束字符串等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 18:10:16