关于Nodejs中net的createServer的问题请教
关于Nodejs中net的createServer的问题请教
var rpcServer = net.createServer(); rpcServer.listen(config.rpcPort);
rpcServer.close();
请问大家,调用了close()后,为什么客户端还可以联上来呢?
当然可以。在Node.js中,net.createServer()
方法用于创建一个TCP服务器。当你调用 server.close()
方法时,服务器会停止接受新的连接,但已经建立的连接仍然保持活跃状态,直到这些连接被关闭或自然终止。
示例代码
const net = require('net');
const config = {
rpcPort: 8080
};
// 创建服务器
const rpcServer = net.createServer((socket) => {
console.log('Client connected:', socket.remoteAddress, socket.remotePort);
// 当客户端发送数据时
socket.on('data', (data) => {
console.log('Received data from client:', data.toString());
// 向客户端发送响应
socket.write('Hello from server!');
});
// 当客户端断开连接时
socket.on('end', () => {
console.log('Client disconnected');
});
});
// 监听端口
rpcServer.listen(config.rpcPort, () => {
console.log(`Server listening on port ${config.rpcPort}`);
});
// 关闭服务器
setTimeout(() => {
rpcServer.close(() => {
console.log('Server closed');
});
}, 5000);
// 模拟客户端连接
setTimeout(() => {
const clientSocket = new net.Socket();
clientSocket.connect(config.rpcPort, '127.0.0.1', () => {
console.log('Connected to server');
clientSocket.write('Hello from client!');
});
clientSocket.on('data', (data) => {
console.log('Received data from server:', data.toString());
clientSocket.destroy(); // 关闭客户端连接
});
clientSocket.on('close', () => {
console.log('Client connection closed');
});
}, 2000);
解释
-
创建服务器:
const rpcServer = net.createServer((socket) => { ... });
这里我们创建了一个TCP服务器,并为每个新连接提供一个回调函数来处理连接事件。
-
监听端口:
rpcServer.listen(config.rpcPort, () => { ... });
服务器开始监听指定的端口。
-
关闭服务器:
setTimeout(() => { rpcServer.close(() => { ... }); }, 5000);
在5秒后关闭服务器。此时,服务器将不再接受新的连接,但已有的连接将继续保持。
-
模拟客户端连接:
setTimeout(() => { const clientSocket = new net.Socket(); clientSocket.connect(config.rpcPort, '127.0.0.1', () => { ... }); ... }, 2000);
在2秒后模拟一个客户端连接到服务器。即使服务器已经在5秒后关闭,这个客户端连接仍可以成功建立并通信。
总结
调用 server.close()
只会阻止新的连接,不会立即断开所有现有的连接。因此,如果在调用 close()
后仍有未完成的连接,客户端仍然可以与服务器进行通信,直到这些连接被显式关闭或自然终止。
貌似close以后不接受新连接,但会保持已有连接
官网zpi是这样写的,直到所有连接断开后会抛出close事件。关键是我已经监听到抛出了close事件,然后客户端连上去的时候客户端还会响应连接成功的事件。。。当然,server的connection事件是监听不到了
当您调用 rpcServer.close()
方法时,服务器会停止接受新的连接请求。但是,已经建立的连接仍然保持活动状态,直到客户端主动关闭或超时为止。
这是因为 close()
方法并不会立即终止所有现有的连接。相反,它只是标记服务器不再接受新连接,并允许现有连接继续运行。因此,在调用 close()
后,客户端仍可以继续与已经建立的连接进行通信。
如果需要立即关闭所有现有连接,您需要遍历服务器的所有已连接套接字并逐个关闭它们。
以下是一个示例代码:
const net = require('net');
const config = { rpcPort: 12345 };
const rpcServer = net.createServer((socket) => {
socket.on('end', () => {
console.log('Client disconnected');
});
});
rpcServer.listen(config.rpcPort, () => {
console.log(`Server is listening on port ${config.rpcPort}`);
});
// 关闭服务器
function closeServer() {
rpcServer.close(() => {
console.log('Server closed');
// 遍历所有已连接的套接字并关闭它们
rpcServer.getConnections((err, count) => {
if (count > 0) {
rpcServer.connections.forEach((socket) => {
socket.destroy();
});
}
});
});
}
// 示例:调用 closeServer 函数来关闭服务器
setTimeout(closeServer, 5000);
在这个示例中,我们定义了一个 closeServer
函数,该函数首先调用 rpcServer.close()
来停止接受新连接,然后遍历所有已连接的套接字并调用 destroy()
方法来强制关闭它们。这样可以确保所有现有连接都将在短时间内被关闭。