请教一下大家,net模块中如何接收长数据?
发布于 3 年前 作者 wldlzt 3512 次浏览 来自 问答

tcp_client.on(‘data’,function(data){ console.log(data.toString()); var test = JSON.parse(data.toString()); }) tcp_client.on(‘end’,function(){ console.log(‘data end!’); }) 目前出现一个情况是data中接收的数据量如果少一些,那立即JSON.parse是没问题的,数据量多就会出现接收不完整,本想着设置一个全局变量累积data的接收再到end里JSON.parse,但也不行,麻烦有了解的朋友指点一二,这个跟Http的接收似乎有很大不同

9 回复

如果整个传输过程只有一段 JSON 数据,只是因为内容太长被分包发送的话,可以这样:

const buf = [];
tcp_client.on("data", chunk => buf.push(chunk));
 tcp_client.on("end", () => {
   // Buffer.concat 用于拼接多段Buffer
   // 再将其转为字符串,然后JSON.parse
   const test = JSON.parse(Buffer.concat(buf).toString());
 });

如果是传输过程中可能连续接收多段JSON,发送每一段 JSON 数据前需要有几个字节表示后面要接收数据的长度,这个会比较复杂一些:

[第一段长度][第一段JSON数据][第二段长度][第二段JSON数据]...

@leizongmin 马上来试一下~~~谢谢谢谢

@leizongmin 还是不行,tcp_client.on(“end”, () 并未触发

TCP是流式协议。数据没有边界的,你需要定义一个应用层协议。比如https://github.com/theanarkh/tiny-fsm

@theanarkh 原来如此…我先看看这个怎么用

建议用websocket,websocket协议本身就解决了TCP粘包拆包的问题,可以单独起websocket服务,也可以与http服务器集成在一起

发送方先发个 数据长度的数字, 然后再发JSON字符串

接收方自然就知道目前有没有接收完成了

同意6楼 。直接 WebSocket 最简便了。

回到顶部