You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么从控制台向Node.js服务端发数据时,服务端会迭代重复返回响应?

问题根因
  • 客户端重复注册data事件监听:每次调用waitForUserInput处理用户输入时,都会给客户端socket新增一个data事件回调。每发送一次数据,监听数量就+1,服务端返回数据时所有注册的回调都会同时触发,自然会出现N次重复打印的情况。
  • 定时逻辑错误:使用了setInterval调度下一次输入,setInterval会间隔1秒持续重复执行waitForUserInput,会导致后续自动高频弹出输入提示,不符合交互逻辑。
修复方案

服务端代码逻辑正常无需修改,仅需要调整客户端代码:

  1. 将client的data事件监听移到连接成功回调的最外层,全局仅注册一次
  2. 把setInterval替换为直接调用waitForUserInput,实现一次输入完成后再等待下一次输入的效果

修复后的客户端代码如下:

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

  // 全局仅注册一次data监听
  client.on('data', function(server_data) {
    console.log('DATA: ' + server_data);
  });

  // 持续交互逻辑
  function waitForUserInput() {
    r1.question("Enter some data you wish to send: ", function(data) {
      if(data == "exit") {
        r1.close();
        client.destroy(); // 退出时主动关闭socket连接
      } else {
        // 向服务端写入输入数据
        client.write(data);
        // 输入处理完成后直接调用下一次输入,不需要定时器
        waitForUserInput();
      }
    });
  }

  waitForUserInput();
});

内容的提问来源于stack exchange,提问作者odnal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:57:02