为什么服务器对我从控制台发送的每条新输入数据进行迭代响应?

Why does the server respond iteratively with each new piece of input data I send it from the console?

我只是想学习一些客户端-服务器基础知识,而且我几乎已经完成了我想做的事情。我只是向服务器发送一些输入,并让它用收到的数据响应客户端。但是,一旦我发送了第一条数据,它就可以正常工作,但是一旦我发送了另一个输入,服务器就会响应同一条数据的两个实例,依此类推。我该如何解决这个问题?

服务器:

var net = require('net');

var HOST = '127.0.0.1';
var PORT = 6969;

var server = net.createServer();
server.on('connection', function(sock) {
  console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);

  sock.on('data', function(data) {
    console.log('DATA ' + sock.remoteAddress +':' + data);
    // write back data received to the client
    sock.write('You said "' + data + '"');
  });
});

server.listen(PORT, HOST);

console.log('Server listening on ' + HOST +':'+ PORT);

客户端:

var net = require('net');
var readline = require('readline');

var HOST = '127.0.0.1';
var PORT = 6969;

const r1 = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

var client = new net.Socket();
client.connect(PORT, HOST, function() {
  console.log('CONNECTED TO: ' + HOST + ':' + PORT);

  // continue talkback
  function waitForUserInput() {
    r1.question("Enter some data you wish to send: ", function(data) {
      if(data == "exit") {
        r1.close();
      } else {
        // write input data to the server
        client.write(data);
        // receive what data server sends back to client
        client.on('data', function(server_data) {
          console.log('DATA: ' + server_data);
        });
        setInterval(waitForUserInput, 1000);
      }
    });
  }

  waitForUserInput();

});

您不断添加越来越多的 client.on('data', ...) 处理程序。每次调用 waitForUserInput(),您最终都会为 data 消息添加另一个重复的处理程序。因此,在调用 waitForUserInput() 两次后,您有两个相同的 data 消息处理程序,因此当一条新数据到达时,两个处理程序中的每一个都会被调用,并且控制台中的输出会出现两次。一件一件的数据到达,但您有重复的处理程序正在侦听它。

您可以使用 .once() 而不是 .one(),或者您可以将侦听传入数据的处理程序移到函数外部,这样它就只安装一次。

顺便说一句,由于几个原因,这里使用 setInterval() 也是一个问题。每次调用 waitForUserInput() 时,您都在创建一个新的间隔计时器,而这与实际回答问题的时间之间没有协调。