首页 > 解决方案 > 如何递归运行 net.Sockets.connect(port, host)?

问题描述

我正在尝试递归运行net.connect(port, host)以便在连接失败时重试一定次数(net.Socket.connect 返回 false),所需的输出是表示连接是否最终的布尔值成功或失败。从逻辑上讲,我可以根据提供的retries值使用 for 循环,但我试图避免 eslint Disallow Functions in Loops (no-loop-func)错误。这是我的 net.connect(port, host) 基本(无重试)实现的代码。我将如何递归地实现这个?

const net = require('net');

checkPort(host, port, callback) {
    try {
      const socket = new net.Socket();
      let status = false;
      socket.connect(port, host, () => {
        status = true;
        socket.setTimeout(1000, () => socket.destroy());
      });
      socket.setTimeout(1000);
      socket.on('timeout', () => {
        socket.destroy();
      });
      socket.on('close', () => callback(status, null));

      return callback(status, null);
    } catch (err) {
      return callback(null, err);
    }
  }

以下似乎会递归调用 net.connect,但它只在关闭前调用一次:

const net = require('net');

const socket = new net.Socket();
const port = 8080;
const host = 'pizza.com';
const retries = 5;
let attempt;
let status = false;

function tryConnect(attempts) {
  socket.connect(port, host);
  socket.setTimeout(100);
  attempt = attempts;
}

// this behave normally
socket.on('connect', () => {
  status = true;
  console.log(status);
  console.log('Connected to', host, 'on', port);
  socket.destroy();
});

// this unexpectedly leads to just one attempt to connect before closing
socket.on('timeout', () => {
  attempt += 1;
  if (attempt <= retries) {
    console.log('Connection failed. Retrying (Attempt ', attempt, 'of', retries, ').');
    tryConnect(attempt);
  } else {
    console.log('Connection to', host, 'on port', port, 'failed.');
    socket.destroy();
  }
});

socket.on('close', () => {
  console.log('Connection closed');
});

socket.on('error', () => {
  console.log(status);
});

tryConnect(0);

在构建这个时我应该做些什么不同的事情?此外,在我可以重新尝试连接之前,是否必须销毁、结束或关闭 net.Socket?

标签: javascriptnode.jssockets

解决方案


推荐阅读