启动一个服务器来监听连接。
net.Server
可以是 TCP 或 [IPC] 服务器,具体取决于它监听的内容。
可能的参数:
- [
server.listen(handle[, backlog][, callback])
][server.listen(handle)
] - [
server.listen(options[, callback])
][server.listen(options)
] - [
server.listen(path[, backlog][, callback])
][server.listen(path)
] 用于 [IPC] 服务器。 - [server.listen([port[, host[, backlog]]][, callback])][server_listen_port] 用于 TCP 服务器。
这个函数是异步的。当服务器开始监听时,会触发 ['listening'
] 事件。
最后一个参数 callback
将被添加为 ['listening'
] 事件的监听器。
所有的 listen()
方法都可以使用一个 backlog
参数来指定待连接队列的最大长度。
实际的长度将由操作系统的 sysctl 设置决定,例如 Linux 上的 tcp_max_syn_backlog
和 somaxconn
。
此参数的默认值是 511 (不是512)。
所有的 [net.Socket
] 都被设置为 SO_REUSEADDR
(详见 [socket(7)
])。
当且仅当上次调用 server.listen()
发生错误或已经调用 server.close()
时,才能再次调用 server.listen()
方法。否则将抛出 ERR_SERVER_ALREADY_LISTEN
错误。
监听时最常见的错误之一是 EADDRINUSE
。
这是因为另一个服务器已正在监听请求的 port
/path
/handle
。
处理此问题的一种方法是在一段时间后重试:
server.on('error', (e) => {
if (e.code === 'EADDRINUSE') {
console.log('地址正被使用,重试中...');
setTimeout(() => {
server.close();
server.listen(PORT, HOST);
}, 1000);
}
});