由于WebSocket允许保持长连接,因此当建立连接后服务器可以主动地向Client发送相关信息.下面通过服务端获取当前CPU的使用情况主动发送给网页,让网页实时显示CPU使用情况的曲线图.该事例的主要功能是包括服务端获取CPU使和情况和HTML5使用canvas进行曲线图绘制.

应用效果

实现效果主要是模仿windows的任务管理器,显示每个核的工作情况.

C#获取CPU使用情况

可能通过PerformanceCounter来获取具本CPU线程的使用情况,不过在构建PerformanceCounter前先获取到CPU对应的线程数量.获取这个数量可以通过Environment.ProcessorCount属性获取,然后遍历构建每个PerformanceCounter

int coreCount = Environment.ProcessorCount;        for (int i = 0; i < coreCount; i++){mCounters.Add(new PerformanceCounter("Processor", "% Processor Time", i.ToString()));}

为了方便计数器的处理,简单地封装了一个基础类,完整代码如下:

/// <summary>/// Copyright © henryfan 2012      ///Email:  henryfan@msn.com   ///HomePage:    http://www.ikende.com       ///CreateTime:  2012/12/24 15:10:44/// </summary>public class ProcessorCounter{private List<PerformanceCounter> mCounters = new List<PerformanceCounter>();public IList<PerformanceCounter> Counters{get{return mCounters;}}public void Open(){int coreCount = Environment.ProcessorCount;        for (int i = 0; i < coreCount; i++){mCounters.Add(new PerformanceCounter("Processor", "% Processor Time", i.ToString()));}}public ItemUsage[] GetValues(){ItemUsage[] values = new ItemUsage[mCounters.Count];for (int i = 0; i < mCounters.Count; i++){values[i] = new ItemUsage();values[i].ID = i.ToString();values[i].Name = "CPU " +i.ToString();values[i].Percent =  mCounters[i].NextValue();}return values;}}public class ItemUsage{public string Name { get; set; }public float Percent { get; set; }public  string ID { get; set; }}

这样一个用于统计CPU所有线程使用情况计数的类就完成了.

页面绘制处理

首先定义一些简单的处理结构

function ProcessorInfo() {this.Item = null;this.Points = new Array();for (var i = 0; i < 50; i++) {this.Points.push(new Point(0, 0));}}function Point(x, y) {this.X = x;this.Y = y;}

主要定义线程信息结构,默认初始化50个座标,当在接收服务线程使用情况的时候,构建一个点添加到数组件尾部同时把第一个移走.通过定时绘制这50个点的曲线这样一个动态的走势就可以完成了.

function drawProceessor(item) {var canvas = document.getElementById('processimg' + item.Item.ID);var context = canvas.getContext('2d');context.beginPath();context.rect(0, 0, 200, 110);context.fillStyle = 'black';context.fill();context.lineWidth = 2;context.strokeStyle = 'white';context.stroke();context.beginPath();context.moveTo(2, 106);for (var i = 0; i < item.Points.length; i++) {context.lineTo(4 * i + 2, 110 - item.Points[i].Y - 4);}context.lineTo(200, 106);context.closePath();context.lineWidth = 1;context.fillStyle = '#7FFF00';context.fill();context.strokeStyle = '#7CFC00';context.stroke();context.font = '12pt Calibri';context.fillStyle = 'white';context.fillText(item.Item.Name, 60, 20);}function addUploadItem(info) {if (cpus[info.ID] == null) {var pinfo = new ProcessorInfo();pinfo.Item = info;$('<canvas id="processimg' + info.ID + '" width="200" height="110"></canvas>').appendTo($('#lstProcessors'));cpus[info.ID] = pinfo;processors.push(pinfo);pinfo.Points.shift();pinfo.Points.push(new Point(0, info.Percent));drawProceessor(pinfo);} else {var pinfo = cpus[info.ID];pinfo.Points.shift();pinfo.Points.push(new Point(0, info.Percent));}}

只需要通过定时器来不停地更新线程使用绘制即可.

setInterval(function () {for (var i = 0; i < processors.length; i++) {drawProceessor(processors[i]);}}, 1000);

服务端

对于服务端其实可以根据自己的需要来使用websocket协议实现,.net 4.5也提供相应的封装.而这里则使用了beetle对应websocket的扩展协议包,整体代码如下:

class Program : WebSocketJsonServer{static void Main(string[] args){TcpUtils.Setup("beetle");Program server = new Program();server.Open(8070);Console.WriteLine("websocket start@8070");ProcessorCounter counters = new ProcessorCounter();counters.Open();while (true){ItemUsage[] items = counters.GetValues();foreach (ItemUsage item in items){Console.WriteLine("{0}:{1}%", item.Name, item.Percent);}JsonMessage message = new JsonMessage();message.type = "cpu useage";message.data = items;foreach (TcpChannel channel in server.Server.GetOnlines()){channel.Send(message);}System.Threading.Thread.Sleep(995);}System.Threading.Thread.Sleep(-1);}protected override void OnError(object sender, ChannelErrorEventArgs e){base.OnError(sender, e);Console.WriteLine(e.Exception.Message);}protected override void OnConnected(object sender, ChannelEventArgs e){base.OnConnected(sender, e);Console.WriteLine("{0} connected", e.Channel.EndPoint);}protected override void OnDisposed(object sender, ChannelDisposedEventArgs e){base.OnDisposed(sender, e);Console.WriteLine("{0} disposed", e.Channel.EndPoint);}}

每秒获取一次CPU的使用情况,并把信息以json的方式发送给当前所有在线的连接.

下载

完整代码:ProcessorsMonitor.rar (686.02 kb)

演示地址:http://html5.ikende.com/ProcessorsMonitor.htm (浏览器使用chrome或IE10)

HTML5-WebSocket实现对服务器CPU实时监控相关推荐

  1. html监控服务器状态,HTML5-WebSocket实现对服务器CPU实时监控

    由于WebSocket允许保持长连接,因此当建立连接后服务器可以主动地向Client发送相关信息.下面通过服务端获取当前CPU的使用情况主动发送给网页,让网页实时显示CPU使用情况的曲线图.该事例的主 ...

  2. 服务器部署 配置jetty运行参数_Zookeeper+websocket实现对分布式服务器的实时监控...

    Zookeeper简介 Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统. 简单来说就是一个Zookeeper注册同步中心,内部结构为一个树形目录,每个节点上可以存放一定量(默 ...

  3. 镜像服务器文件实时监控同步程序

    这是为我们网站解决南北电信网通互联互通问题而写的一个程序. 优游中国(www.yooyocn.com)是一个大型旅游门户网站,提供了资讯,视频,图片,博客,论坛等大数据量的业务内容. 为了使全国各地的 ...

  4. linux cpu intr s,Linux CPU实时监控命令mpstat介绍

    [root@ora10g ~]# mpstat -P ALL 2 5 4,字段含义如下 英文解释: CPU:Processor number. The keyword all indicates th ...

  5. SpringBoot+WebSocket实时监控异常

    欢迎关注方志朋的博客,回复"666"获面试宝典 写在前面 此异常非彼异常,标题所说的异常是业务上的异常. 最近做了一个需求,消防的设备巡检,如果巡检发现异常,通过手机端提交,后台的 ...

  6. 用Spotlight on windows 实时监控Windows服务器性能

    用Spotlight on windows 实时监控Windows服务器性能 2010-02-03 10:30:25|  分类: else |  标签: |字号大中小 订阅 用Spotlight on ...

  7. 服务器实时状态检测源码,开源运维监控框架Netdata——实时监控系统性能

    开源运维监控框架Netdata--实时监控系统性能 开源运维监控框架Netdata--实时监控系统性能 作为一个Linux的SA,很有必要掌握一个专门的系统监控工具,以便能随时了解系统资源的占用情况. ...

  8. 用python监控磁盘_使用python怎么对服务器cpu和磁盘空间进行监控

    使用python怎么对服务器cpu和磁盘空间进行监控 发布时间:2021-01-29 17:16:55 来源:亿速云 阅读:82 作者:Leah 这期内容当中小编将会给大家带来有关使用python怎么 ...

  9. 监控HP服务器cpu状态脚本

    监控HP服务器cpu状态脚本 脚本1(如有问题则发邮件通知): # vi cpu.sh 按a或i进入编辑模式 #!/bin/bash Name=`hostname` IP=`/sbin/ifconfi ...

最新文章

  1. Java数组中文排序_Java模块 -- 数组/集合中文汉字排序(支持生僻汉字)
  2. msbuild 语法_用于删除文件的MSBuild Task语法
  3. curl linux 数组参数_Linux系统调用原理
  4. 自然语言处理----处理原始文本
  5. Dapr牵手.NET学习笔记:开篇
  6. JS判断相等或者不等于(==、===、!=、!==)运算符
  7. Python的安装(源码编译安装,IDE安装)
  8. Delphi编译指令了解学习
  9. python3自定义函数(五分钟读懂)
  10. JAVA 程序员需要用到 10 个测试框架和库
  11. Android WatchDog正解
  12. java中if结构用图表示_Java if语句结构和指令流水线
  13. 电影天堂电影链接爬取
  14. excel设置曲线图横坐标值
  15. {MySQL数据库初识}一 数据库概述 二 MySQL介绍 三 MySQL的下载安装、简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 初识sql语句...
  16. [游戏开发]网络同步方式
  17. 【错误记录】Google Play 上架报错 ( 此版本不符合 Google Play 关于提供 64 位版本应用的要求。| 如果提供 x86 架构动态库则必须提供 x86_64 架构的动态库 )
  18. 解决:测试HDFS读写性能时出现错误
  19. excel 修改设置(将excel修改后缀名,解压缩方式)
  20. 心电信号越界怎么回事_心慌胸闷到医院检查心电图却查不出问题,这到底咋回事?...

热门文章

  1. java中数据库连接池_Java中的数据库连接池
  2. 计算机的发展知识点,计算机一级MsOffice考试知识点:计算机的发展
  3. table取tr对象 vue_javascript的DOM对象终极总结:你必看的js面向对象
  4. 百练OJ:2807:两倍
  5. Java代码注释规约
  6. 沟通管理计划3个过程及重点
  7. 笔记-高项案例题-2015年下-计算题
  8. Winform中使用FileStream读取文件后,继续操作提示:it is being used by anothor process
  9. Nodejs中搭建一个静态Web服务器,通过读取文件获取响应类型
  10. Vue实现仿音乐播放器12-实现歌手页面效果