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