首页 > 解决方案 > 为什么服务器会反复响应我从控制台发送的每条新输入数据?

问题描述

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

服务器

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();

});

标签: node.jssockets

解决方案


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

您可以使用.once()代替,.one()也可以将侦听传入数据的处理程序移动到函数之外,因此它只安装一次且仅安装一次。

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


推荐阅读