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

标签 javascript node.js

我不知道我在这里缺少什么,但 Node 似乎将两个不同的请求解释为一个请求,除非您添加超时,例如在下面的代码中,当我写入服务器一和服务器二并将结果推送到数组时它只是组合两个字符串并将它们解释为一个字符串,而当我添加 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 毫秒超时时,您会间隔读取操作,从而确保数据被拆分。

关于javascript - 为什么 ('data' ) 监听器会将 2 个不同的请求解释为一个,除非您添加超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33516684/

相关文章:

javascript - 测试正则表达式时,Continue 语句被忽略

javascript - 使用 Node.js 管理文件

javascript - Grunt Task Runner 连接文件

node.js - 如何开发 https Nodejs Web 应用程序以便不显示安全警告

javascript - 为什么 JavaScript 不在 while 循环内堆叠

javascript - 如何在异步测试中对 sinon spy 进行计时

javascript - 用于设置 SESSION 值的切换按钮

javascript - FAB 组按钮未设置状态 - React Native

javascript - TypeScript 中 Array.find() 方法与 req.param 的用法

javascript - 正则表达式来剪切数字