满意答案
傻_兔兔13
2016.09.01
采纳率:50% 等级:9
已帮助:567人
大体思路就是将返回数据给用户的定时行为,跟更新内存状态的行为分开:
1.当用用户连接时,开启一个计时器,每秒计算一次内存状态,并且将这个结果保存到一个全局变量中。
2.用户本身还需要开启一个计时器,每秒会去全局变量拉取内存的状态,然后返回给客户端呈现。
3.当所有用户都处于断开连接时,服务器处于挂起状态,不在去获取内存状态的变化,节省了资源浪费。
这样,不管有多少个用户连接到服务器,更新内存的状态的行为只会每秒执行一次。
优化后的服务器代码如下:
[javascript] view plain copy
//send memory info per second
var WebSocketServer = require('ws').Server,
wss = new WebSocketServer({port:8181});
var spawn = require('child_process').spawn;
var mem = {};
var clientMemUpdater = undefined;
function updateMemInfo(){
var free = spawn('free',['-k']);
free.stdout.on('data',function(data){
var strdata = ""+data;
console.log(strdata);
//正则匹配,获取数据
var re = /Mem: *(\d*) *(\d*) *(\d*) *(\d*) *(\d*) *(\d*)/;
var result = strdata.match(re);
if(result.length>0){
mem["total"] = parseInt(result[1]);
mem["used"] = parseInt(result[2]);
mem["free"] = parseInt(result[3]);
//mem["shared"] = parseInt(result[4]);
mem["buffers"] = parseInt(result[5]);
mem["cached"] = parseInt(result[6]);
}
});
}
updateMemInfo();
wss.on('connection',function(ws){
var clientMemSend;
var sendMemUpdates = function(ws){
if(ws.readyState == 1){
ws.send(JSON.stringify(mem));
}
}
clientMemSend = setInterval(function(){
if(typeof clientMemUpdater == 'undefined'){
clientMemUpdater = setInterval(updateMemInfo,1000);
}
sendMemUpdates(ws);
},1000);
sendMemUpdates(ws);
if(typeof clientMemUpdater == 'undefined'){
clientMemUpdater = setInterval(updateMemInfo,1000);
}
ws.on("close",function(){
if(typeof clientMemSend != 'undefined'){
clearInterval(clientMemSend);
}
if(typeof clientMemUpdater !='
00分享举报