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'); });
关键修复点说明
- 缓存完整响应:用
receivedBuffer拼接每次收到的chunk,直到检测到结束标记!!再处理,确保拿到完整的响应内容。 - 统一换行符:通过正则替换把
\r转为\n,解决不同终端对换行符的解析差异。 - 简化编码设置:
client.setEncoding('ascii')直接修改socket的编码,无需赋值给变量,原代码的ascii.on('data')写法冗余(本质还是监听client的事件)。
内容的提问来源于stack exchange,提问作者Mail
相关产品推荐
相关产品推荐

