server.listen()
启动监听连接的服务器。net.Server 可以是 TCP 或 IPC 服务器,具体取决于它监听的内容。
¥Start a server listening for connections. A net.Server can be a TCP or
an IPC server depending on what it listens to.
可能的语法有:
¥Possible signatures:
-
server.listen(path[, backlog][, callback])用于 IPC 服务器¥
server.listen(path[, backlog][, callback])for IPC servers -
server.listen([port[, host[, backlog]]][, callback])用于 TCP 服务器¥
server.listen([port[, host[, backlog]]][, callback])for TCP servers
这个函数是异步的。当服务器开始监听时,将触发 'listening' 事件。最后一个参数 callback 将被添加为 'listening' 事件的监听器。
¥This function is asynchronous. When the server starts listening, the
'listening' event will be emitted. The last parameter callback
will be added as a listener for the 'listening' event.
所有 listen() 方法都可以采用 backlog 参数来指定挂起连接队列的最大长度。实际长度将由操作系统通过 sysctl 设置确定,例如 Linux 上的 tcp_max_syn_backlog 和 somaxconn。此参数的默认值为 511(而非 512)。
¥All listen() methods can take a backlog parameter to specify the maximum
length of the queue of pending connections. The actual length will be determined
by the OS through sysctl settings such as tcp_max_syn_backlog and somaxconn
on Linux. The default value of this parameter is 511 (not 512).
所有 net.Socket 都设置为 SO_REUSEADDR(详见 socket(7))。
¥All net.Socket are set to SO_REUSEADDR (see socket(7) for
details).
当且仅当在第一次 server.listen() 调用期间出现错误或 server.close() 已被调用时,才能再次调用 server.listen() 方法。否则,将抛出 ERR_SERVER_ALREADY_LISTEN 错误。
¥The server.listen() method can be called again if and only if there was an
error during the first server.listen() call or server.close() has been
called. Otherwise, an ERR_SERVER_ALREADY_LISTEN error will be thrown.
收听时最常见的错误之一是 EADDRINUSE。当另一台服务器已经在监听请求的 port/path/handle 时,就会发生这种情况。处理此问题的一种方法是在一定时间后重试:
¥One of the most common errors raised when listening is EADDRINUSE.
This happens when another server is already listening on the requested
port/path/handle. One way to handle this would be to retry
after a certain amount of time:
server.on('error', (e) => {
if (e.code === 'EADDRINUSE') {
console.error('Address in use, retrying...');
setTimeout(() => {
server.close();
server.listen(PORT, HOST);
}, 1000);
}
});