为什么on('data')监听器将两个不同的请求解释为一个请求,除非您添加超时

我不知道我在这里丢失了什么,但节点似乎将2个不同的请求解释为一个单独的请求,除非您添加超时,例如在下面的代码中,当我写入服务器1和2时,将结果推送到数组这两个string和解释他们作为一个,而当我添加一个10毫秒的延迟,然后按我需要的方式工作。

var arr = []; var server = net.createServer(function(socket){ socket.on('data', function(data){ arr.push(data.toString()); }); }).listen(8080); var connection = net.connect({host: 'localhost', port: 8080}); connection.write('one'); connection.write('two'); setTimeout(function() { connection.write('three') }, 10); setTimeout(function() { connection.write('four') }, 20); setTimeout(function() { connection.write('five') }, 30); setTimeout(function(){ console.log(arr); //[ 'onetwo', 'three', 'four', 'five' ] }, 2000); 

这里的“请求”一词是不正确的。 当你处理套接字时,你不会“请求”一些东西。 套接字不等于http请求。 套接字是您可以读取和写入的数据源。 在发送数据之前,数据是如何分开的,当读取数据时读取数据是没有意义的 – 读取所有可用的数据。

如果将多个缓冲区连续写入同一个套接字,那么很可能在内核调用套接字来处理数据时,第二次写入的数据已经到达并在同一个读取操作中处理。

当您将10毫秒超时时,您会间隔读取操作,从而确保数据被分离。