几个小时后,Nodejs 服务器停止接受连接
Nodejs server stop accept connections after a few hours
我制作了一个应用程序来控制同时登录,在启动时一切正常,但是几个小时后我无法再连接到服务器,我的客户端 returns 我出现以下错误: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);
我发现了几个可能的问题。仅通过检查代码,我们很难知道哪些问题实际上是导致问题的原因。无论如何,你应该清理这些问题,看看它是否改善了情况:
您应该响应 disconnect
事件并在断开连接时立即从 clients
阵列中删除任何套接字。
在您要删除给定用户的任何先前实例的循环中,当您在中间执行 .splice(x, 1)
时,您的 for
循环将无法正常工作for
循环。这将在数组中执行一个操作后移动所有项目,从而导致您跳过对数组中下一个元素的比较。解决这个问题的一种简单方法是向后迭代数组:for (var x = clients.length - 1; x >= 0; x--)
因为在 .splice()
之后位置受到影响的元素是您已经查看过的元素。 None会漏掉。
除此之外,您应该检查 nodejs 进程的内存使用情况、nodejs 进程打开的套接字以及 nodejs 进程的 CPU 使用情况,以查看是否存在任何可能的问题。
还有,你的部署环境是什么?您的网络服务器前面是否有代理服务器?
我制作了一个应用程序来控制同时登录,在启动时一切正常,但是几个小时后我无法再连接到服务器,我的客户端 returns 我出现以下错误: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);
我发现了几个可能的问题。仅通过检查代码,我们很难知道哪些问题实际上是导致问题的原因。无论如何,你应该清理这些问题,看看它是否改善了情况:
您应该响应
disconnect
事件并在断开连接时立即从clients
阵列中删除任何套接字。在您要删除给定用户的任何先前实例的循环中,当您在中间执行
.splice(x, 1)
时,您的for
循环将无法正常工作for
循环。这将在数组中执行一个操作后移动所有项目,从而导致您跳过对数组中下一个元素的比较。解决这个问题的一种简单方法是向后迭代数组:for (var x = clients.length - 1; x >= 0; x--)
因为在.splice()
之后位置受到影响的元素是您已经查看过的元素。 None会漏掉。
除此之外,您应该检查 nodejs 进程的内存使用情况、nodejs 进程打开的套接字以及 nodejs 进程的 CPU 使用情况,以查看是否存在任何可能的问题。
还有,你的部署环境是什么?您的网络服务器前面是否有代理服务器?