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的接收似乎有很大不同
如果整个传输过程只有一段 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 最简便了。