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

我做了一个应用程序来控制同时login,在开始一切正常完美,但是几个小时后,我不能再连接到服务器,我的客户端返回给我以下错误: net :: ERR_CONNECTION_TIMED_OUT,并在服务器端没有发生任何错误,如正确运行…代码如下:

客户端:

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. 您应该响应disconnect事件,并立即删除clientsarrays中的任何套接字,当它断开连接。

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

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

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

一个提示是永远使用:

一个简单的CLI工具,用于确保给定的脚本连续运行(即永远)。

教程: http : //blog.nodejitsu.com/keep-a-nodejs-server-up-with-forever/