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

