Javascript 如何等待net.socket中的数据完全提交

Javascript 如何等待net.socket中的数据完全提交,javascript,node.js,Javascript,Node.js,我需要从Windows应用程序接收一个大的JSON字符串。然而,我似乎不知道如何在关闭连接之前等待数据完全传输 我读到我需要等待一个电话回电,我看了一遍电话,我无法理解 一般来说,我对Node.js和Javascript编程还不熟悉,所以请在这里耐心听我说 client.on('data', function(data) { completeData = data; //Close the connection client.end(); }); client.on('

我需要从Windows应用程序接收一个大的JSON字符串。然而,我似乎不知道如何在关闭连接之前等待数据完全传输

我读到我需要等待一个电话回电,我看了一遍电话,我无法理解

一般来说,我对Node.js和Javascript编程还不熟悉,所以请在这里耐心听我说

client.on('data', function(data) {

    completeData = data;
    //Close the connection
    client.end();
});
client.on('end', function() {
    //Parse the data after receiving full json
    responseData = JSON.parse(completeData);
    console.log('Received data \r\n' + JSON.stringify(responseData,   null, 4));
    client.destroy();
    console.log('Connection closed');
    next();
});
编辑:

我已经试过了,但在我得到所有数据之前,它仍然会关闭它

client.on('data', function (data) {

if (newlineRegex.test(data)) {
    console.log('Received: ' + data);
    responseData = JSON.parse(data);
    console.log('Received data \r\n' + JSON.stringify(responseData, null, 4));
    client.end();
}
}))

编辑:添加完整代码,我一定是遗漏了什么。 如果我添加不起作用的代码,它会将JSON.parse执行为fast,如果我添加,它根本不会解析它(不会在client.on('end')中结束)


需要某种已建立的协议来确定“消息”的结尾,因为TCP连接是流。例如,UDP数据包没有内置的“消息”边界


在JSON的情况下,解决这个问题的一个流行且简单的方法是只使用换行符分隔的JSON字符串。这样,您所需要做的就是不断地缓冲数据,直到看到换行符,然后您就知道您已经到达了JSON消息的末尾,并且可以安全地解析它。

下面的代码应该可以工作。如果不起作用,请告诉我

client.on('data', function(data) {
   //Parse the data after receiving full json
   responseData = JSON.parse(data);
   console.log('Received data \r\n' + JSON.stringify(responseData,null,4));

   client.destroy();
   console.log('Connection closed');
   next();
});

client.on('error', function(){
   console.log('error happened');
});

您不应该在
data
事件中
end
连接,因为
data
会为您收到的每个数据块触发。我确实需要在收到数据后关闭连接,那么我该怎么做呢?您确实需要关闭连接,但在收到所有数据之后。这应该发生在
client.on('end',function(){})
如何实现?我已经尝试添加了上面的代码,请参见编辑。为了使换行定界解决方案能够工作,另一方必须不发送格式化的/pretty-fied”JSON。它只发送一个字符串,这就是为什么我在接收到它后,对它进行字符串化,以查看数据是否正确格式化/在对象中。我从不以这种方式输入client.on('end')代码。net.socket一直在侦听。您可以在客户端中使用
client.destroy()
。客户端中的on('end')代码未执行。我不知道为什么。我更新了我的答案<代码>结束事件在套接字的另一端关闭客户端时在客户端上发出<代码>数据可以多次调用。
client.on('data', function(data) {
   //Parse the data after receiving full json
   responseData = JSON.parse(data);
   console.log('Received data \r\n' + JSON.stringify(responseData,null,4));

   client.destroy();
   console.log('Connection closed');
   next();
});

client.on('error', function(){
   console.log('error happened');
});