用代码实现Nodejs关闭服务器

用代码实现Nodejs关闭服务器

本人需要通过代码实现服务器打开关闭。 相关代码如下: var express = require(‘express’); var app = express(); var http = require(‘http’).Server(app); var io = require(‘socket.io’)(http); //打开服务器 server.prototype.openServer = function(){ http.listen(3001, function(){ console.log(‘listening on *:3001’); }); } //关闭服务器 server.prototype.stopServer = function(){ http.close(function(){ console.log(‘stop listening’); }) } 在这里我将打开和关闭服务器写成两个函数,方便调用。 但是关闭服务器代码是有问题的,当没有客户端连上服务器时,关闭服务器代码能正常工作。但当有客户端连上服务器时,http.close()并不执行。本人菜鸟一枚,不知道问题出在哪里,请求高手指点迷津,感激不尽!!


6 回复

当然可以。根据你提供的代码片段,你已经实现了基本的服务器打开和关闭功能。但是,当你遇到有客户端连接时,http.close() 并没有正确执行的问题,这可能是因为在客户端连接时,你并没有处理这些连接的状态。

为了确保服务器能够正确关闭,我们需要确保所有活动的连接都被适当地终止。这里有一个改进后的版本,它使用了 socket.io 来管理客户端连接,并确保在关闭服务器时,所有客户端连接都被正确终止。

改进后的代码

var express = require('express');
var app = express();
var http = require('http').createServer(app);
var io = require('socket.io')(http);

// 打开服务器
function openServer() {
    http.listen(3001, () => {
        console.log('listening on *:3001');
    });
}

// 关闭服务器
function stopServer(callback) {
    // 首先关闭 socket.io 的所有连接
    io.close(() => {
        // 然后关闭 HTTP 服务器
        http.close(() => {
            if (callback) {
                callback();
            }
            console.log('Server stopped');
        });
    });
}

// 示例:如何使用这两个函数
openServer();

// 假设某个事件触发服务器关闭
setTimeout(() => {
    stopServer(() => {
        console.log('Server shutdown completed.');
    });
}, 5000); // 5秒后关闭服务器

解释

  1. openServer 函数:这个函数启动 HTTP 服务器并监听端口 3001。当服务器启动时,它会打印一条消息到控制台。

  2. stopServer 函数:这个函数首先调用 io.close() 来关闭所有 socket.io 连接。一旦所有 socket.io 连接被关闭,它才会调用 http.close() 来关闭 HTTP 服务器。最后,如果提供了回调函数(如上面的示例),则会在服务器完全停止后执行该回调函数。

  3. 示例使用:在这个示例中,我们首先打开了服务器,然后在 5 秒后关闭它。你可以根据实际需求调整关闭时间或触发条件。

通过这种方式,你可以确保在关闭服务器之前,所有的客户端连接都被正确地终止。


我的express是3.16.6版本,node是v0.10.26版本

跪求大神指点

process.exit(); :D 关得彻底… 你把服务器关了,怎么再把它开启 ~

是不是还要把socket关了?

在你的代码中,http.close() 方法是正确的,用于关闭 HTTP 服务器。然而,如果你遇到有客户端连接时无法关闭服务器的情况,可能是因为某些事件或操作没有正确处理。

下面是一个改进的版本,包括使用 socket.io 来确保所有客户端连接都被正确断开后再关闭服务器:

var express = require('express');
var app = express();
var http = require('http').createServer(app);
var io = require('socket.io')(http);

io.on('connection', function(socket) {
    console.log('a user connected');
    
    socket.on('disconnect', function() {
        console.log('user disconnected');
    });
});

app.get('/', function(req, res) {
    res.send('Hello World!');
});

var server = http.listen(3001, function() {
    console.log('listening on *:3001');
});

server.prototype.openServer = function() {
    server.listen(3001, function() {
        console.log('listening on *:3001');
    });
};

server.prototype.stopServer = function() {
    io.sockets.disconnect(); // 断开所有客户端连接
    server.close(function() {
        console.log('server closed');
    });
};

// 示例调用
// server.stopServer();

解释

  1. Express 和 Socket.IO 初始化:初始化 Express 应用和 Socket.IO 服务器。
  2. 客户端连接和断开事件处理:添加了客户端连接和断开事件的监听器。
  3. 打开服务器:定义了一个 openServer 方法来启动服务器。
  4. 关闭服务器:定义了一个 stopServer 方法来停止服务器。这里使用了 io.sockets.disconnect() 来断开所有客户端连接,然后再调用 server.close() 关闭服务器。

这样可以确保在关闭服务器之前,所有客户端连接都被正确断开。

回到顶部