CNode

请教一下大家,net模块中如何接收长数据?

问答
Wwldlzt发布于5 年前最后回复5 年前9 回复4665 浏览0 收藏

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)

L
leizongmin#1·5 年前

如果整个传输过程只有一段 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数据]...
T
theanarkh#4·5 年前

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

Z
zengming00#6·5 年前

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

N
netwjx#8·5 年前

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

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

M
myy#9·5 年前

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

参与回复
登录后即可参与回复。登录