WebSocket入门教程(三)-- WebSocket实例:实时获取服务器内存使用情况

【实例简介】


  前面我们已经介绍了WebSocket的概念和WebSocket的Api,下面我们通过一个简单的实例,来实际体验一下WebSocket。
  下面,我们要展示的是一个实时获取服务器内存使用情况的一个案例。用户打开页面,通过websocket连接到服务器,服务器每隔一秒钟,会返回服务器内存的使用情况,达到对内存的实时监控,作为运维人员来说,可以通过微信,手机浏览器等实现对服务器状态的实时监听。

【客户端】


    首先,我们需要设计一个简单的页面,页面主要包含一个表格,表格会列出内存的总容量、正在使用的内存、闲置的内存、以及写缓存和读缓存。
    我们先看看客户端的头部,再来讲解思路:

[html]  view plain  copy
  1. <!DOCTYPE html>  
  2. <html lang="en">  
  3. <head>  
  4. <title>WebSocket入门教程(三)-- WebSocket实例:实时获取服务器内存使用情况</title>  
  5.     <meta charset="utf-8">  
  6.     <meta http-equiv="X-UA-Compatible" content="IE=edge">  
  7.     <meta name="viewport" content="width=device-width, initial-scale=1">  
  8.     <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/4.0.0-alpha.2/css/bootstrap.css">  
  9.     <link rel="stylesheet" href="http://cdn.bootcss.com/tether/1.3.2/css/tether.css"/>  
  10.     <script src="http://cdn.bootcss.com/jquery/2.2.4/jquery.js" ></script>  
  11.     <script src="http://cdn.bootcss.com/tether/1.3.2/js/tether.js"></script>  
  12.     <script src="http://cdn.bootcss.com/bootstrap/4.0.0-alpha.2/js/bootstrap.js"></script>  
  13.     <script>  
  14.     // code from chapter goes here  
  15.         $(function() {  
  16.                 //alert("xxx");  
  17.                 var ws = new WebSocket("ws://www.liumumu.top:8181");  
  18.   
  19.                 var mem = {"total": 0,  
  20.                           "used": 0,  
  21.                           "free": 0,  
  22.                           "buffers": 0,  
  23.                           "cached": 0};  
  24.                 ws.onopen = function(e){  
  25.                         console.log("Connection established");  
  26.   
  27.                 };  
  28.   
  29.                 var changeMemEntry = function(field,originalValue,newValue){  
  30.                         var valElem = $('#' + field + ' span');  
  31.                         valElem.html(newValue);  
  32.                         if(originalValue == 0){  
  33.                                 return;  
  34.                         }  
  35.                         if(field =="free"){  
  36.                                 if(newValue < originalValue){  
  37.                                         valElem.addClass('label-danger');  
  38.                                         valElem.removeClass('label-success');  
  39.                                 }else if(newValue>originalValue){  
  40.                                         valElem.addClass('label-success');  
  41.                                         valElem.removeClass('label-danger');  
  42.                                 }  
  43.                         }else{  
  44.                                 if(newValue > originalValue){  
  45.                                         valElem.addClass('label-danger');  
  46.                                         valElem.removeClass('label-success');  
  47.                                 }else if(newValue<originalValue){  
  48.                                         valElem.addClass('label-success');  
  49.                                         valElem.removeClass('label-danger');  
  50.                                 }  
  51.                         }  
  52.   
  53.                 }  
  54.                 ws.onmessage = function(e){  
  55.                         var memData = JSON.parse(e.data);  
  56.                         //console.log("onmessage",memData);  
  57.                         for(var field in memData){  
  58.                                 if(memData.hasOwnProperty(field)){  
  59.   
  60.                                         changeMemEntry(field,mem[field],memData[field]);  
  61.                                         mem[field] = memData[field];  
  62.                                 }  
  63.                         }  
  64.                 }  
  65.                 ws.onerror = function(e){  
  66.                         console.log("WebSocket failure,error",e);  
  67.                         //handleErrors(e);  
  68.                 }  
  69.                 ws.onclose = function(e){  
  70.                         console.log(e);  
  71.                         console.log(e.reason+" "+e.code);  
  72.                         for(var field in mem){  
  73.                                 if(mem.hasOwnProperty(field)){  
  74.                                         mem[field] = 0;  
  75.                 }  
  76.                         }  
  77.                 }  
  78.   
  79.   
  80.         });  
  81.     </script>  
  82.     <style>  
  83.         html,body{  
  84.                 height:100%;  
  85.   
  86.         }  
  87.     </style>  
  88. </head>  
  89. <body lang="cn">  
  90.     <div class="vertical-center">  
  91.         <div class="container">  
  92.             <h1 style="text-align:center;padding:5px;">柳木木ECS概况</h1>  
  93.             <table class="table" id="memTable">  
  94.             <thead>  
  95.                 <tr>  
  96.                 <th>类型</th>  
  97.                 <th>大小(KB)</th>  
  98.                 </tr>  
  99.             </thead>  
  100.             <tbody id="memRows">  
  101.             <tr>  
  102.                 <td><h3>内存总量</h3></td>  
  103.                 <td id="total">  
  104.                 <h3><span class="label label-default label-success">0.00</span></h3>  
  105.                 </td>  
  106.             </tr>  
  107.             <tr>  
  108.                 <td><h3>已使用内存</h3></td>  
  109.                 <td id="used">  
  110.                 <h3><span class="label label-default label-success">0.00</span></h3>  
  111.                 </td>  
  112.             </tr>  
  113.             <tr>  
  114.                 <td><h3>闲置内存</h3></td>  
  115.                 <td id="free">  
  116.                 <h3><span class="label label-default label-success">0.00</span></h3>  
  117.                 </td>  
  118.             </tr>  
  119.             <tr>  
  120.                 <td><h3>写缓存</h3></td>  
  121.                 <td id="buffers">  
  122.                 <h3><span class="label label-default label-success">0.00</span></h3>  
  123.                 </td>  
  124.             </tr>  
  125.             <tr>                  
  126.             <td><h3>读缓存</h3></td>  
  127.                 <td id="cached">  
  128.                 <h3><span class="label label-default label-success">0.00</span></h3>  
  129.                 </td>  
  130.             </tr>  
  131.             </tbody>  
  132.             </table>  
  133.         </div>  
  134.     </div>  
  135. </body>  
  136. </html>  

    准备工作,我们先引入了jquery,bootstrap库,用于样式呈现。
    首先我们连接服务器,然后给每个字段附上初始值0,定义了changeMemEntry用来更新页面的数据和样式。
在onmessage回调方法里,我们将接收到的json字符串解析成json对象,然后遍历对象的每个属性,将属性值传递给changeMemEntry,实现数据的更新。在onclose回调方法里,我们将数据清0。

页面的展示效果如下图:



【服务器端】

    本案例服务器端,我们通过nodejs实现,大体步骤如下
1.创建websocket服务,监听8181端口。
2.当客户端请求连接并且连接成功时,运行linux的free命令,获取内存信息,通过正则将标准输出字符串,转换成json对象,然后返回给客户端。
3.开始定时器,每一秒钟执行循环第2步操作。
4.当连接关闭时,清除定时器。

[javascript]  view plain  copy
  1. //send memory info per seconds  
  2. var WebSocketServer = require('ws').Server,  
  3.         wss = new WebSocketServer({port:8181});  
  4.   
  5.   
  6. var spawn = require('child_process').spawn;  
  7.   
  8. function sendMemInfo(ws){  
  9.         var free = spawn('free',['-k']);  
  10.         free.stdout.on('data',function(data){  
  11.                 var strdata = ""+data;  
  12.                 //console.log(strdata);  
  13.                 //正则匹配,获取数据  
  14.                 var re = /Mem: *(\d*) *(\d*) *(\d*) *(\d*) *(\d*) *(\d*)/;  
  15.                 var result = strdata.match(re);  
  16.                 var mem = {};  
  17.                 if(result.length>0){  
  18.                         mem["total"] = parseInt(result[1]);  
  19.                         mem["used"] = parseInt(result[2]);  
  20.                         mem["free"] = parseInt(result[3]);  
  21.                         //mem["shared"] = parseInt(result[4]);  
  22.                         mem["buffers"] = parseInt(result[5]);  
  23.                         mem["cached"] = parseInt(result[6]);  
  24.                         ws.send(JSON.stringify(mem));  
  25.                 }  
  26.         });  
  27. }  
  28.   
  29. wss.on('connection',function(ws){  
  30.         var clientMemUpdater;  
  31.         var sendMemUpdates = function(ws){  
  32.                 if(ws.readyState == 1){  
  33.                         sendMemInfo(ws);  
  34.                 }  
  35.         }  
  36.         clientMemUpdater = setInterval(function(){  
  37.                 sendMemUpdates(ws);  
  38.         },1000);  
  39.         var clientStocks = [];  
  40.         sendMemUpdates(ws);  
  41.         ws.on("close",function(){  
  42.                 if(typeof clientMemUpdater != 'undefined'){  
  43.                         clearInterval(clientMemUpdater);  
  44.                 }  
  45.         });  
  46. });  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值