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

Node.js通过TCP获取原始数据时换行异常问题排查

Node.js TCP客户端换行异常问题排查与解决

问题原因分析

  • TCP流式传输的分段特性:TCP是基于流的协议,data事件会在每次收到缓冲区数据时触发,不一定返回完整响应。Putty等工具会自动缓存数据直到完整接收后渲染,而你的代码收到部分数据就直接打印,导致换行被拆分、显示混乱。
  • 换行符格式不匹配:服务器返回的换行符可能是\r(回车符)而非Node.js终端默认解析的\n(换行符),Putty能自动识别这类换行符,但Node.js的console.log不会自动转换,导致换行不生效。
  • 未处理完整响应:你的代码没有判断响应的结束标记(!!),无法确保拿到完整响应数据就进行打印。

修复后的代码示例

const net = require('net');

const HOST = '127.0.0.1';
const PORT = 1024;

const client = new net.Socket();
let receivedBuffer = ''; // 缓存完整响应数据

client.connect(PORT, HOST, () => {
    console.log('Connected to server');
});

// 设置编码,直接在client上监听事件即可
client.setEncoding('ascii');

client.on('data', (chunk) => {
    receivedBuffer += chunk;
    // 检测是否收到响应结束标记!!
    if (receivedBuffer.endsWith('!!')) {
        // 统一换行符格式:将\r替换为\n,确保终端正确解析
        const formattedData = receivedBuffer.replace(/\r/g, '\n');
        console.log(formattedData);
        // 重置缓存,准备接收下一次响应
        receivedBuffer = '';
    }
});

// 增加错误和关闭事件监听,便于排查问题
client.on('error', (err) => {
    console.error('Connection error:', err.message);
});

client.on('close', () => {
    console.log('Connection closed');
});

关键修复点说明

  1. 缓存完整响应:用receivedBuffer拼接每次收到的chunk,直到检测到结束标记!!再处理,确保拿到完整的响应内容。
  2. 统一换行符:通过正则替换把\r转为\n,解决不同终端对换行符的解析差异。
  3. 简化编码设置:client.setEncoding('ascii')直接修改socket的编码,无需赋值给变量,原代码的ascii.on('data')写法冗余(本质还是监听client的事件)。

内容的提问来源于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:18