几个小时后,Nodejs服务器停止接受连接

时间:2015-11-16 18:03:50

标签: javascript node.js websocket server client

我做了一个应用程序来控制同时登录,在启动一切正常,但几个小时后我再也无法连接到服务器,我的客户端返回以下错误: net :: ERR_CONNECTION_TIMED_OUT < / strong>并且在服务器端没有发生任何错误,例如它正确运行...下面的代码:

客户端:

var socket;
function connect(id) {
    socket = io.connect('http://IP:4200');
    
    
    socket.on('connect', function (data) {
        socket.emit('join', id);
    });
    
    socket.on('messages', function (data) {
        console.log('MSG: ' + data.toString());

        switch (data.toString()) {
            case "kick":
                socket.close();
                console.log("KICK!");
                break;
            case "duplicate_entry":
                socket.close();
                console.log("Another user connection!");
                break;

        }
    });
}

服务器端:

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var clients = [];

app.use(express.static(__dirname + '/bower_components'));

function logtimestamp() {
    var log_date = new Date();
    log_date = '[' + log_date.getFullYear() + '/' + (log_date.getMonth() + 1) + '/' + log_date.getDate() + ' ' + log_date.getHours() + ':' + log_date.getMinutes() + ':' + log_date.getSeconds() + ']';
    return log_date;
}// FUNCTION logtimestamp


console.log("Start time: " + logtimestamp());
console.log("Server port 4200")
console.log("websocket server created!");

try {
    io.on('connection', function (client) {
        try {
            var id;
            var conexao;

            client.on('join', function (data) {
                try {
                    console.log('Client connected...'+logtimestamp()+' ID:' + data);
                    id = data;
                    conexao = {
                        ws: client,
                        id_user: data
                    };
                    clients.push(conexao);

                    for (var x = 0; x < clients.length; x++) {

                        //desconect previous user
                        try {
                            if (clients[x].id_user == id) {
                                if (clients[x].ws != conexao.ws) {
                                    clients[x].ws.emit('messages', 'duplicate_entry');
                                    clients.splice(x, 1);
                                }
                            }
                          
                        } catch (err) {
                            console.log("ERROR 1: " + err.message);
                        }
                    }
                } catch (err) {
                    console.log("ERROR 2: " + err.message);
                }
            });
        } catch (err) {
            console.log("ERROR 3: " + err.message);
        }
    });
} catch (err) {
    console.log("ERROR 4: " + err.message);
}
server.listen(4200); 

1 个答案:

答案 0 :(得分:1)

我看到了几个可能的问题。我们很难通过检查代码实际上是您问题的原因来了解问题。在任何情况下,您都应该清理这些问题,看看它是否能改善这种情况:

  1. 您应该回复disconnect事件,并在断开连接后立即从clients阵列中删除任何套接字。

  2. 在您想要删除给定用户的任何先前实例的循环中,当您在{{for中间执行时,.splice(x, 1)循环将无法正常工作1}}循环。这将在数​​组中的一个项目之后移动所有项目,从而跳过数组中下一个元素的比较。解决这个问题的一个简单方法是向后迭代数组:for因为在for (var x = clients.length - 1; x >= 0; x--)之后,您已经查看过的元素的位置会受到影响。没有人会错过。

  3. 除此之外,您应该检查nodejs进程的内存使用情况,nodejs进程的开放套接字以及nodejs进程的CPU使用情况,以查看是否有任何指向任何可能的问题。

    而且,您的部署环境是什么?您的Web服务器前面是否有代理服务器?