Javascript Socket io vs Nodejs:2k并发用户时死亡?
我的项目有一个模块。它需要实时将数据从json文件从服务器推送到客户端。我使用Socket IO和Nodejs来监听客户端。我的想法是服务器节点每5秒设置一次间隔并检查当前时间,如果有效,则读取json文件并发送到所有客户端。我尝试使用2k客户机,socket io和nodejs都死掉了。我从名为ttkqxs的文件夹中读取数据,文件名格式为1.json,2.json。阅读和推送非常好,但与2k客户端和更多我有麻烦。这是我的代码,有什么问题吗Javascript Socket io vs Nodejs:2k并发用户时死亡?,javascript,node.js,sockets,Javascript,Node.js,Sockets,我的项目有一个模块。它需要实时将数据从json文件从服务器推送到客户端。我使用Socket IO和Nodejs来监听客户端。我的想法是服务器节点每5秒设置一次间隔并检查当前时间,如果有效,则读取json文件并发送到所有客户端。我尝试使用2k客户机,socket io和nodejs都死掉了。我从名为ttkqxs的文件夹中读取数据,文件名格式为1.json,2.json。阅读和推送非常好,但与2k客户端和更多我有麻烦。这是我的代码,有什么问题吗 // Dependencies var app = r
// Dependencies
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var fs = require('fs');
var async = require('async');
// Time config
var MN_START_HOUR = 16,
MN_START_MIN = 5,
MN_END_MIN = 45,
MT_START_HOUR = 17,
MT_START_MIN = 5,
MT_END_MIN = 45,
MB_START_HOUR = 18,
MB_START_MIN = 5,
MB_END_MIN = 45;
var intervalTime = 5000;
var MB_ID = 22;
var MB = 1;
var MT = 2;
var MN = 3;
var firstTimeMb = true;
var firstTimeMt = true;
var firstTimeMn = true;
// Server ready
http.listen(3113, function () {
console.log('Server listening on port: 3113 ');
var timer = setInterval(function () {
var date = new Date();
var min = date.getMinutes();
var sec = date.getSeconds();
var hour = date.getHours();
console.log("CurrentTime: " + hour + ":" + min + ":" + sec);
// Mien Bac
if (hour === MB_START_HOUR && min >= MB_START_MIN && min <= MB_END_MIN) {
if (firstTimeMb) {
firstTimeMb = false;
emitRegionData(MB, 'first_time_' + MB);
}
emitRegionData(MB, 'return_g_result_' + MB);
emitProvincesData(MB);
}
// Miền Trung
if (hour === MT_START_HOUR && min >= MT_START_MIN && min <= MT_END_MIN) {
if (firstTimeMt) {
firstTimeMt = false;
emitRegionData(MT, 'first_time_' + MT);
}
emitRegionData(MT, 'return_g_result_' + MT);
emitProvincesData(MT);
}
//Miền Nam
if (hour === MN_START_HOUR && min >= MN_START_MIN && min <= MN_END_MIN) {
if (firstTimeMn) {
firstTimeMn = false;
emitRegionData(MN, 'first_time_' + MN);
}
emitRegionData(MN, 'return_g_result_' + MN);
emitProvincesData(MN);
}
// reset first time
if (hour == 23) {
firstTimeMb = true;
firstTimeMt = true;
firstTimeMn = true;
}
}, intervalTime);
});
/**
* Get province data from json file and emit to all client
* Desktop: Use in home page, province page
* Mobile: Only use in province page
* @param {int} pid Province id
* @returns
*/
function emitProvinceData(pid) {
var fileName = __dirname + '/ttkqxs/' + pid + '.json';
fs.exists(fileName, function () {
fs.readFile(fileName, function (err, content) {
if (err) {
throw err;
}
io.sockets.emit('return_p_result_' + pid, content);
});
});
}
/**
* Get province data from json file and emit to all client
* Desktop: Use in home page, province page
* Mobile: Only use in province page
* @param {int} pid Province id
* @returns
*/
function emitProvincesData(rid) {
var fileName = __dirname + '/ttkqxs/mien' + rid + '.json';
fs.exists(fileName, function () {
fs.readFile(fileName, function (err, content) {
if (err) {
throw err;
}
var ids = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(content)));
for (var i in ids) {
emitProvinceData(ids[i].id);
}
});
});
}
/**
* Emit Region data
* Use in mobile for multiple province
* @param {int} rid Region id
* @returns
*/
function emitRegionData(rid, eventName) {
var fileName = __dirname + '/ttkqxs/mien' + rid + '.json';
fs.exists(fileName, function () {
fs.readFile(fileName, function (err, content) {
if (err) {
throw err;
}
var ids = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(content)));
var files = [];
for (var i in ids) {
var pFileName = __dirname + '/ttkqxs/' + ids[i].id + '.json';
files.push(pFileName);
}
async.map(files, readAsync, function (err, results) {
io.sockets.emit(eventName, JSON.stringify(results));
});
});
});
}
/**
* Read file Async
* @param {string} file File Path
* @param {function} callback
* @returns
*/
function readAsync(file, callback) {
fs.readFile(file, 'utf8', callback);
}
//依赖项
var app=require('express')();
var http=require('http')。服务器(应用程序);
var io=require('socket.io')(http);
var fs=需要('fs');
var async=require('async');
//时间配置
var MN_启动小时=16,
MN_开始_最小值=5,
MN_END_MIN=45,
MT\U开始时间=17小时,
MT\U START\U MIN=5,
MT_END_MIN=45,
MB_开始_小时=18,
MB_开始_最小值=5,
MB_END_MIN=45;
var间隔时间=5000;
var MB_ID=22;
var-MB=1;
var-MT=2;
var-MN=3;
var firstTimeMb=true;
var firstTimeMt=true;
var firstTimeMn=true;
//服务器就绪
http.listen(3113,函数(){
log('Server监听端口:3113');
变量计时器=设置间隔(函数(){
变量日期=新日期();
var min=date.getMinutes();
var sec=date.getSeconds();
var hour=date.getHours();
日志(“当前时间:+hour+:“+min+”:“+sec”);
//风采
如果(hour===MB_START_hour&&min>=MB_START_min&&min=MT_START_min&&min=MN_START_min&&min-Uhm…您能为我们提供错误的堆栈跟踪吗?我看到nodejs服务器不再工作,计时器没有运行,命令行中没有显示错误或日志消息。因此它没有响应。我要做的第一件事就是从m setInterval to setTimeout,以避免在下一次开始之前未完成上一次读取/广播的可能情况。但我的业务要求在内容文件更改时向所有客户端发送,因此我的解决方案是每5秒读取一次文件,如您所见,我认为没有响应:(是什么导致文件更改?最好的情况是仅在文件更改时发出,而不是每5秒发出一次。为什么要一次又一次地发出相同的数据?