关于Nodejs中net的createServer的问题请教

关于Nodejs中net的createServer的问题请教

var rpcServer = net.createServer(); rpcServer.listen(config.rpcPort);

rpcServer.close();

请问大家,调用了close()后,为什么客户端还可以联上来呢?

4 回复

当然可以。在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);

解释

  1. 创建服务器:

    const rpcServer = net.createServer((socket) => { ... });
    

    这里我们创建了一个TCP服务器,并为每个新连接提供一个回调函数来处理连接事件。

  2. 监听端口:

    rpcServer.listen(config.rpcPort, () => { ... });
    

    服务器开始监听指定的端口。

  3. 关闭服务器:

    setTimeout(() => {
        rpcServer.close(() => { ... });
    }, 5000);
    

    在5秒后关闭服务器。此时,服务器将不再接受新的连接,但已有的连接将继续保持。

  4. 模拟客户端连接:

    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() 方法来强制关闭它们。这样可以确保所有现有连接都将在短时间内被关闭。

回到顶部