Прослушивание одного и того же хоста и порта дважды не вызывает ошибку - PullRequest
0 голосов
/ 11 января 2019
const http  = require("http");

function createServer(
  name,
  hostname
)
{
  const server = http.createServer(
    (
      request,
      response
    ) =>
    {
      console.log("request on", name);
      response.end(name);
    }
  );

  server.on(
    "error",
    (error) => console.log(`${name} error`, error)
  );

  server.on(
    "close",
    () => console.log(`${name} closed`)
  );

  server.listen(4321, hostname, () => console.log(`${name} listening (${server.listening}) on address`, server.address()));
}

createServer(
  "Server 1",
  "localhost"
);

createServer(
  "Server 2",
  "127.0.0.1"
);

createServer(
  "Server 3",
  "127.0.1.1"
);

createServer(
  "Server 4",
  "localhost"
);

createServer(
  "Server 5",
  "10.9.129.49"
);

createServer(
  "Server 6",
  "localhost"
);

Используя Node v6.15.1, v8.14.1 и v10.15.0, приведенный выше код распечатывает это на моем компьютере:

Server 2 listening (true) on address { address: '127.0.0.1', family: 'IPv4', port: 4321 }
Server 3 listening (true) on address { address: '127.0.1.1', family: 'IPv4', port: 4321 }
Server 5 listening (true) on address { address: '10.9.129.49', family: 'IPv4', port: 4321 }
Server 1 listening (true) on address { address: '127.0.0.1', family: 'IPv4', port: 4321 }
Server 4 listening (true) on address { address: '127.0.0.1', family: 'IPv4', port: 4321 }
Server 6 listening (true) on address { address: '127.0.0.1', family: 'IPv4', port: 4321 }

Как это возможно? Я ожидал, что появится ошибка EADDRINUSE.

РЕДАКТИРОВАТЬ В предыдущей версии этого вопроса только два сервера использовали имя хоста localhost. Код был обновлен, чтобы продемонстрировать, что проблема, кажется, сохраняется независимо от количества серверов или хоста.

UPDATE

Я попытался смешать разные имена хостов, которые указывают на мой компьютер (localhost, 127.0.0.1, мой локальный IP-адрес и т. Д.), И хотя напечатанный объект address показывает разные значения для address(), никаких ошибок не происходит. .

Мне любопытно, касается ли он метода server.listen Node.js, позволяющего вызываться несколько раз. Возможно, Node.js обнаруживает, что все имена хостов, которые я использовал, привязываются к одному и тому же устройству и порту, поэтому он просто «открывается заново», как сказано в документации.

...