net.Server类


此类用于创建 TCP 或本地服务器。

net.Server 是一个带有以下事件的 EventEmitter

‘connection’ 事件

  • {net.Socket} 连接对象

当一个新的连接建立时发出。socket 是一个 net.Socket 实例。

‘listening’ 事件

当服务器调用 server.listen 后被绑定时发出。

‘close’ 事件

当服务器关闭时发出。请注意,如果存在连接,不会发出此事件,直到所有的连接都结束了才发出。

‘error’ 事件

  • {Error}

当发生错误时发出。‘close’ 事件将这个事件后直接调用,详见在 server.listen 讨论中的例子。

server.maxConnections

当服务器的连接数变高时,设置此属性可以拒绝更多的连接。

一旦一个 socket 通过 child_process.fork() 被发送到子进程时,不推荐使用此选项。

server.connections

稳定度:0 - 已废弃:使用 server.getConnections() 替代。

服务器上的并行连接数。

当通过 child_process.fork() 发送一个 socket 到子进程时,它会变成 null。要轮询派生进程并获得当前活动的连接号,请使用异步的 server.getConnections 代替。

server.listen(port[, hostname][, backlog][, callback])

在指定的 porthostname 上,开始接受连接。如果省略 hostname,当 IPv6 可用时,该服务器将接收任何 IPv6 地址(::)的连接,否则,接收任何 IPv4 地址(0.0.0.0)的连接。当端口值为零时,将分配一个随机端口。

backlog 正在连接队列的最大长度。实际长度会根据你的操作系统通过 sysctl 设置来定,例如在 linux 上的 tcp_max_syn_backlogsomaxconn。该参数的默认值是 511(不是 512)。

该函数是异步的。当服务器已经绑定,将发出 ‘listening’ 事件。最后的参数 callback 将会作为 ‘listening’ 事件的一个监听器。

有一个问题,一些用户在运行后得到了 EADDRINUSE 错误。这意味着,另一个服务器已经运行在了请求的端口上。处理的方法之一是等待一秒钟,然后重试。这可以这么做:

  1. server.on('error', (e) => {
  2. if (e.code == 'EADDRINUSE') {
  3. console.log('Address in use, retrying...');
  4. setTimeout(() => {
  5. server.close();
  6. server.listen(PORT, HOST);
  7. }, 1000);
  8. }
  9. });

(注意:Node.js 的所有 socket 都已经设置了 SO_REUSEADDR。)

server.listen(path[, backlog][, callback])

  • path {String}

  • backlog {Number}

  • callback {Function}

启动本地 socket 服务器监听指定 path 上的连接。

该函数是异步的。当服务器已经绑定,将发出 ‘listening’ 事件。最后的参数 callback 将会作为 ‘listening’ 事件的一个监听器。

在 UNIX 中,本地域通常称之为 UNIX 域。路径是一个文件系统路径名。它受到相同的命名约定和在文件创建时完成的权限检查,将在文件系统中可见,并将持续到解除链接

在 Windows 中,本地域使用命名 pipe 来实现。该路径必须参考 \\?\pipe\\\.\pipe\ 条目。允许任何字符,但后者可能会做 pipe 名称的一些处理,如解析 .. 序列。尽管出现,该 pipe 命名空间是平的。Pipe 不会持续下去,当它们的最后参考被关闭时,它们将被移除。不要忘记 JavaScript 字符串转义 requirejs 路径用双反斜线来指定。例如:

  1. net.createServer().listen(path.join('\\\\?\\pipe', process.cwd(), 'myctl'))

backlog 参数的行为类似于 server.listen(port[, hostname][, backlog][, callback])

server.listen(handle[, backlog][, callback])

  • handle {Object}

  • backlog {Number}

  • callback {Function}

handle 对象既可以被设置为一个服务器,也可以被设置为一个 socket(任何具有的基础 _handle 任何成员)或一个 {fd: <n>} 对象。

这会使得服务器接受指定的句柄连接,并假设它是一个文件描述符或已经绑定到端口的句柄或域 socket。

在 Windows 上不支持监听文件描述符。

该函数是异步的。当服务器已经绑定,将发出 ‘listening’ 事件。最后的参数 callback 将会作为 ‘listening’ 事件的一个监听器。

backlog 参数的行为类似于 server.listen(port[, hostname][, backlog][, callback])

  1. server.listen({
  2. host: 'localhost',
  3. port: 80,
  4. exclusive: true
  5. });

server.listen(options[, callback])

  • options {Object} - 需要。支持以下属性:

    • port {Number} - 可选。

    • host {String} - 可选。

    • backlog {Number} - 可选。

    • path {String} - 可选。

    • exclusive {Boolean} - 可选。

  • callback - 可选。

optionsporthostbacklog 属性以及可选的回调函数,它们的行为和在 server.listen(port[, hostname][, backlog][, callback]) 中的调用相同。另外,path 选项可用于指定 UNIX socket。

如果 exclusivefalse(默认),那么集群的工作进程将使用相同的基础句柄,允许连接共享处理业务。当 exclusivetrue 时,不共享句柄,并试图端口共享结果会导致错误。监听专用端口上的例子如下所示。

server.address()

返回绑定的地址,该地址名称族和服务器的端口由操作系统报告。当得到一个系统分配的地址时,用于查找哪个端口已经被分配。返回具有三个属性的对象,如 { port: 12346, family: 'IPv4', address: '127.0.0.1' }

示例:

  1. var server = net.createServer((socket) => {
  2. socket.end('goodbye\n');
  3. }).on('error', (err) => {
  4. // handle errors here
  5. throw err;
  6. });
  7. // grab a random port.
  8. server.listen(() => {
  9. address = server.address();
  10. console.log('opened server on %j', address);
  11. });

直到发生 ‘listening’ 事件前,不要调用 server.address()

server.close([callback])

停止服务器接受新的连接,并保持现有的连接。该函数是异步的,当所有的连接都结束并且服务器发生 ‘close’ 事件时,服务器最终关闭。可选的 callback'close' 事件发生时调用一次。不同于事件,当它被关闭时,如果服务器未打开,它将用 Error 作为其唯一的参数调用。

server.unref()

如果这是在事件系统中唯一的活动服务器,在服务器上调用 unref 将允许程序退出。如果服务器已经 unrefd,再次调用 unref 将没有效果。

返回 server

server.ref()

unref 相反,在一个之前 unrefd 的服务器上调用 ref不会让程序退出,如果它是唯一剩下的服务器(默认行为)。如果服务器已经 refd,再次调用 ref 将没有效果。

返回 server