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

Why does on('data') listener interpret 2 different requests as one unless you add timeout

本文关键字:一个 解释 添加 请求 超时 两个 侦听器 data on 为什么      更新时间:2023-09-26

我不知道这里缺少了什么,但除非添加超时,否则节点似乎会将两个不同的请求解释为一个请求。例如,在下面的代码中,当我写入服务器一和二并将结果推送到数组时,它只是将两个字符串组合起来并将它们解释为一,而当我添加10ms延迟时,它会按照我需要的方式工作。

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毫秒的超时时,您会间隔读取操作,从而确保数据被拆分。