- 浏览: 7254320 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
最近由于项目需要学习远程监控软件,在网上查看网友关于监控软件的设计方案,同时查找是否有第三方软件提供自己集成到项目中应用组件。有童鞋说AjaxVNC开始显示监控远程桌面的功能,于是下载AjaxVNC学习使用。
在SOurceForge网站下载AjaxVNC的组件。
网址如下:
http://sourceforge.net/projects/ajaxvnc/files/ajaxvnc/ajaxvnc-r01.00/ajaxvnc-r01.00.zip
查看AjaxVNC的源代码可以发现,AjaxVNC的原理如下,通过观察者模式TileObservable类观察桌面是否变化,如果变化,由主线程通过Swing抓取远程桌面信息形成一张JPG的图片,通过AJAX将图片的信息发送给监控者。
一个重点生成图片的类类如下
public class KVMManager { private boolean DEBUG = true; private Robot robot; private BufferedImage screenimage; private Rectangle screenbound; private HashMap keymap; /** Creates a new instance of KVMManager */ public KVMManager() { if (DEBUG) System.out.println(getClass().getName() + ": KVMManager created."); setScreenBound(getDefaultScreenBound()); robot = createRobot(); screenimage = null; keymap = new HashMap(); assignKeyMap(); } private void assignKeyMap() { // First row keymap.put(new Integer(27 ), new Integer(KeyEvent.VK_ESCAPE)); // Esc keymap.put(new Integer(192 ), new Integer(KeyEvent.VK_BACK_QUOTE)); // ` keymap.put(new Integer(49 ), new Integer(KeyEvent.VK_1)); // 1 keymap.put(new Integer(50 ), new Integer(KeyEvent.VK_2)); // 2 keymap.put(new Integer(51 ), new Integer(KeyEvent.VK_3)); // 3 keymap.put(new Integer(52 ), new Integer(KeyEvent.VK_4)); // 4 keymap.put(new Integer(53 ), new Integer(KeyEvent.VK_5)); // 5 keymap.put(new Integer(54 ), new Integer(KeyEvent.VK_6)); // 6 keymap.put(new Integer(55 ), new Integer(KeyEvent.VK_7)); // 7 keymap.put(new Integer(56 ), new Integer(KeyEvent.VK_8)); // 8 keymap.put(new Integer(57 ), new Integer(KeyEvent.VK_9)); // 9 keymap.put(new Integer(48 ), new Integer(KeyEvent.VK_0)); // 0 keymap.put(new Integer(189 ), new Integer(KeyEvent.VK_MINUS)); // - keymap.put(new Integer(187 ), new Integer(KeyEvent.VK_EQUALS)); // = keymap.put(new Integer(8 ), new Integer(KeyEvent.VK_BACK_SPACE)); // Backspace // Second row keymap.put(new Integer(9 ), new Integer(KeyEvent.VK_TAB)); // Tab keymap.put(new Integer(81 ), new Integer(KeyEvent.VK_Q)); // Q keymap.put(new Integer(87 ), new Integer(KeyEvent.VK_W)); // W keymap.put(new Integer(69 ), new Integer(KeyEvent.VK_E)); // E keymap.put(new Integer(82 ), new Integer(KeyEvent.VK_R)); // R keymap.put(new Integer(84 ), new Integer(KeyEvent.VK_T)); // T keymap.put(new Integer(89 ), new Integer(KeyEvent.VK_Y)); // Y keymap.put(new Integer(85 ), new Integer(KeyEvent.VK_U)); // U keymap.put(new Integer(73 ), new Integer(KeyEvent.VK_I)); // I keymap.put(new Integer(79 ), new Integer(KeyEvent.VK_O)); // O keymap.put(new Integer(80 ), new Integer(KeyEvent.VK_P)); // P keymap.put(new Integer(219 ), new Integer(KeyEvent.VK_OPEN_BRACKET)); // [ keymap.put(new Integer(221 ), new Integer(KeyEvent.VK_CLOSE_BRACKET)); // ] keymap.put(new Integer(220 ), new Integer(KeyEvent.VK_BACK_SLASH)); // \ keymap.put(new Integer(65 ), new Integer(KeyEvent.VK_A)); // A keymap.put(new Integer(83 ), new Integer(KeyEvent.VK_S)); // S keymap.put(new Integer(68 ), new Integer(KeyEvent.VK_D)); // D keymap.put(new Integer(70 ), new Integer(KeyEvent.VK_F)); // F keymap.put(new Integer(71 ), new Integer(KeyEvent.VK_G)); // G keymap.put(new Integer(72 ), new Integer(KeyEvent.VK_H)); // H keymap.put(new Integer(74 ), new Integer(KeyEvent.VK_J)); // J keymap.put(new Integer(75 ), new Integer(KeyEvent.VK_K)); // K keymap.put(new Integer(76 ), new Integer(KeyEvent.VK_L)); // L keymap.put(new Integer(186 ), new Integer(KeyEvent.VK_SEMICOLON)); // ; keymap.put(new Integer(222 ), new Integer(KeyEvent.VK_QUOTE)); // ' keymap.put(new Integer(13 ), new Integer(KeyEvent.VK_ENTER)); // Enter keymap.put(new Integer(90 ), new Integer(KeyEvent.VK_Z)); // Z keymap.put(new Integer(88 ), new Integer(KeyEvent.VK_X)); // X keymap.put(new Integer(67 ), new Integer(KeyEvent.VK_C)); // C keymap.put(new Integer(86 ), new Integer(KeyEvent.VK_V)); // V keymap.put(new Integer(66 ), new Integer(KeyEvent.VK_B)); // B keymap.put(new Integer(78 ), new Integer(KeyEvent.VK_N)); // N keymap.put(new Integer(77 ), new Integer(KeyEvent.VK_M)); // M keymap.put(new Integer(188 ), new Integer(KeyEvent.VK_COMMA)); // , keymap.put(new Integer(190 ), new Integer(KeyEvent.VK_DECIMAL)); // . keymap.put(new Integer(191 ), new Integer(KeyEvent.VK_SLASH)); // / keymap.put(new Integer(32 ), new Integer(KeyEvent.VK_SPACE)); // Space keymap.put(new Integer(112 ), new Integer(KeyEvent.VK_F1)); // F1 keymap.put(new Integer(113 ), new Integer(KeyEvent.VK_F2)); // F2 keymap.put(new Integer(114 ), new Integer(KeyEvent.VK_F3)); // F3 keymap.put(new Integer(115 ), new Integer(KeyEvent.VK_F4)); // F4 keymap.put(new Integer(116 ), new Integer(KeyEvent.VK_F5)); // F5 keymap.put(new Integer(117 ), new Integer(KeyEvent.VK_F6)); // F6 keymap.put(new Integer(118 ), new Integer(KeyEvent.VK_F7)); // F7 keymap.put(new Integer(119 ), new Integer(KeyEvent.VK_F8)); // F8 keymap.put(new Integer(120 ), new Integer(KeyEvent.VK_F9)); // F9 keymap.put(new Integer(121 ), new Integer(KeyEvent.VK_F10)); // F10 keymap.put(new Integer(122 ), new Integer(KeyEvent.VK_F11)); // F11 keymap.put(new Integer(123 ), new Integer(KeyEvent.VK_F12)); // F12 keymap.put(new Integer(111 ), new Integer(KeyEvent.VK_SLASH)); // / keymap.put(new Integer(42 ), new Integer(KeyEvent.VK_ASTERISK)); // * keymap.put(new Integer(45 ), new Integer(KeyEvent.VK_MINUS)); // - keymap.put(new Integer(0 ), new Integer(KeyEvent.VK_7)); // 7 keymap.put(new Integer(0 ), new Integer(KeyEvent.VK_8)); // 8 keymap.put(new Integer(0 ), new Integer(KeyEvent.VK_9)); // 9 keymap.put(new Integer(43 ), new Integer(KeyEvent.VK_PLUS)); // + keymap.put(new Integer(0 ), new Integer(KeyEvent.VK_4)); // 4 keymap.put(new Integer(0 ), new Integer(KeyEvent.VK_5)); // 5 keymap.put(new Integer(0 ), new Integer(KeyEvent.VK_6)); // 6 keymap.put(new Integer(0 ), new Integer(KeyEvent.VK_1)); // 1 keymap.put(new Integer(0 ), new Integer(KeyEvent.VK_2)); // 2 keymap.put(new Integer(0 ), new Integer(KeyEvent.VK_3)); // 3 keymap.put(new Integer(0 ), new Integer(KeyEvent.VK_0)); // 0 keymap.put(new Integer(46 ), new Integer(KeyEvent.VK_DELETE)); // Del keymap.put(new Integer(13 ), new Integer(KeyEvent.VK_ENTER)); // Enter keymap.put(new Integer(36 ), new Integer(KeyEvent.VK_HOME)); // Home keymap.put(new Integer(38 ), new Integer(KeyEvent.VK_UP)); // Up keymap.put(new Integer(33 ), new Integer(KeyEvent.VK_PAGE_UP)); // PgUp keymap.put(new Integer(37 ), new Integer(KeyEvent.VK_LEFT)); // Left keymap.put(new Integer(39 ), new Integer(KeyEvent.VK_RIGHT)); // Right keymap.put(new Integer(35 ), new Integer(KeyEvent.VK_END)); // End keymap.put(new Integer(40 ), new Integer(KeyEvent.VK_DOWN)); // Down keymap.put(new Integer(34 ), new Integer(KeyEvent.VK_PAGE_DOWN)); // PgDn keymap.put(new Integer(45 ), new Integer(KeyEvent.VK_INSERT)); // Ins keymap.put(new Integer(46 ), new Integer(KeyEvent.VK_DELETE)); // Del } private int convAscii(int ascii) { Integer scancode; scancode = (Integer)keymap.get(new Integer(ascii)); if (scancode==null) return -1; else return scancode.intValue(); } private Robot createRobot() { try { return new Robot(); } catch (Exception e) { e.printStackTrace(); return null; } } public void keyPress(int keycode) { int scancode = convAscii(keycode); if (scancode >= 0) robot.keyPress(scancode); } public void keyRelease(int keycode) { int scancode = convAscii(keycode); if (scancode >= 0) robot.keyRelease(scancode); } public void keyStroke(int keycode) { keyPress(keycode); keyRelease(keycode); } public void mouseMove(int x, int y) { robot.mouseMove(x, y); } public void mousePress(int buttons) { int mask = 0; System.out.println("mousePress:"+buttons); if ((buttons & 1) != 0) mask |= InputEvent.BUTTON1_MASK; if ((buttons & 2) != 0) mask |= InputEvent.BUTTON3_MASK; if ((buttons & 4) != 0) mask |= InputEvent.BUTTON2_MASK; robot.mousePress(mask); } public void mouseRelease(int buttons) { int mask = 0; if ((buttons & 1) != 0) mask |= InputEvent.BUTTON1_MASK; if ((buttons & 2) != 0) mask |= InputEvent.BUTTON3_MASK; if ((buttons & 4) != 0) mask |= InputEvent.BUTTON2_MASK; robot.mouseRelease(mask); } public void mouseStroke(int buttons) { mousePress(buttons); mouseRelease(buttons); } public void setScreenBound(Rectangle bound) { screenbound = bound; if (DEBUG) System.out.println(getClass().getName() + ": Screen setup at " + screenbound.width + "x" + screenbound.height); } public Rectangle getScreenBound() { return screenbound; } public Rectangle getDefaultScreenBound() { // get screen bound GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gd = ge.getDefaultScreenDevice(); return gd.getDefaultConfiguration().getBounds(); } public BufferedImage captureScreen() { screenimage = robot.createScreenCapture(screenbound); return screenimage; } }
由上面AjaxVNC的源代码可以在需要监控的服务中生成一张图片。
一个线程监控类ScreenScanner 如下:
public class ScreenScanner implements Runnable
public void run() { tileman.setSize((int)kvmman.getScreenBound().getWidth(), (int)kvmman.getScreenBound().getHeight()); starttime = System.currentTimeMillis(); while(true) { try { tileman.processImage(kvmman.captureScreen(), 6,6); notifyObservers(); numscan++; //Thread.sleep(300); currenttime = System.currentTimeMillis(); if (DEBUG) { System.out.println(getClass().getName() + ": FPS = " + (double)numscan/(currenttime-starttime)*1000); } } catch (Exception e) { e.printStackTrace(); } } } private void notifyObservers() { for (int i=0; i<tileman.getNumXTile(); i++) { for (int j=0; j<tileman.getNumYTile(); j++) { if (tileman.getTile(i, j).isDirty()) { tileobs.tileChanged(i, j); } tileman.getTile(i, j).clearDirty(); } } }
使用如下:
1。将AjaxVNC组件中MinioHttpd.jar放在classpath路径下。
2。将AjaxVNC组件中源代码拷到,项目Src目录中。
3。将AjaxVNC组件中Bin中的几个文件拷贝到bin目录(重点是run.bat的批处理文件)
4。将相关的AJAX文件 md5.js,ajaxvnc.js,以及remotedeshtop.jsp放在web目录中。
启动web服务器,双击run.bat启动AjaxVNC的远程监控(其实也可以通过java程序在项目启动时自动run.bat的命令即可,减少客户操作)。远程即可看到桌面。
在特定的文件中。
远程监控的桌面如下:http://<server ip address>:8086/remotedesktop.html
其中:server ip address:为特定的监控IP,
8086:特定的端口。
- WebVNC.rar (107.8 KB)
- 下载次数: 70
发表评论
-
Mule ESB 学习笔记(20)Mule和Spring httpinvoker的整合
2013-08-28 13:59 3663mule的配置文件: <?xml version=& ... -
Mule ESB 学习笔记(19)Mule和RSS的整合
2013-08-28 10:08 2518定时扫描特定目录的rss文件: <?xml vers ... -
Mule ESB 学习笔记(18)Mule和ATOM的整合
2013-08-27 20:00 2531定时读取特定文件的rss文件: <?xml ... -
Mule ESB 学习笔记(17)Mule和JMX的整合
2013-08-27 16:48 3978Agent的实现: package com.easyway ... -
Mule ESB 学习笔记(16)CXF SOAP基于SAML的验证的配置
2013-08-27 15:19 3718mule的配置 <mule xmlns:core=& ... -
Mule ESB 学习笔记(15)CXF SOAP基于JKS的验证的配置
2013-08-27 14:57 3766mule的配置如下: <mule xmlns:cor ... -
Mule ESB 学习笔记(14)CXF SOAP基于UsernameToken的验证
2013-08-27 14:16 7870简单需求: 针对在webservice ... -
Mule ESB 学习笔记(13)CSV数据文件到数据库
2013-08-26 17:54 6956简单需求: ... -
Mule ESB 学习笔记(12)JSON转换器的使用
2013-08-26 13:54 8966在许多情况下,可能需要把类转换为js ... -
Mule ESB 学习笔记(11)Web Service Proxy
2013-08-24 19:32 6516一、WebSevice Proxy 简介 ... -
Mule ESB 学习笔记(10)mule事务配置
2013-08-23 16:36 6111在mule的事务可能为jdbc事务,jms事务 ... -
Mule ESB 学习笔记(9)mule配置常用节点解释
2013-08-23 13:27 33261 Mule-config.x ... -
Mule ESB 学习笔记(8)mule和jersey的整合使用
2013-08-23 11:20 3860在项目常用jesery作为rest ... -
Mule ESB 学习笔记(7)服务调用
2013-08-23 10:44 18809一. 服务调用 1. Mule实现并提供Web Servi ... -
Mule ESB 学习笔记(6)配置模式
2013-08-23 10:42 4671为了节省时间,就不翻译了,摘抄重点总结 ... -
Mule ESB 学习笔记(5)异步请求-响应方式
2013-08-22 15:32 34905.4 异步请求-响应方式 异步请求-响应方式即请求方调用 ... -
Mule ESB 学习笔记(4)同步方式
2013-08-22 15:19 41235.3 同步方式 同步方式即请求方调用 ... -
JBOSS EJB3项目启动执行一个任务
2013-08-06 22:26 3725在jboss的项目中,jboss启动 ... -
Jboss @Service的使用
2013-08-06 21:59 1904Jboss有一个扩展的annotation——@Servic ... -
julian Date 计算 和实现
2013-08-01 09:32 4327Qt库里CBSDate类的内部实现用_jd成员进行计算、比较 ...
相关推荐
AjaxVNC 一个简单的远程控制服务器,服务端很小巧,客户端使用浏览器即可
它包含Ngrok,用于为远程桌面公开localhost AjaxVNC(其无密码,无客户端(仅需要浏览器))JRE,用于运行AjaxVNC 注意1:使用github工作流处理更复杂的事情是@ Google61(检查他的项目!他甚至使用工作流来挖掘...
前18大旋转修整器企业占据全球87%的市场份额
SKYSAT IMAGERY PRODUCT SPECIFICATION PLANET.COM VIDEO Full motion videos are collected between 30 and 120 seconds by a single camera from any of the active SkySats. Videos are collected using only the Panchromatic half of the camera, hence all videos are PAN only. Videos are packaged and delivered with a video mpeg-4 file, plus all image frames with accompanying video metadata and a frame index file (reference Product Types below)
Screenshot_20240506_133458_com.netease.yhtj.vivo.jpg
大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,历年美赛特等奖O奖论文
雷达物位变送器安装和操作手册
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
快速排序是一种基于分治策略的排序算法,通过选择一个基准元素,将待排序的数组划分为两个子数组,一个包含所有小于基准的元素,另一个包含所有大于基准的元素,然后递归地对这两个子数组进行快速排序。快速排序在平均情况下具有O(n log n)的时间复杂度,是一种非常高效的排序算法。然而,在最坏情况下,当输入数据已经有序或接近有序时,快速排序的性能会退化为O(n^2)。此外,快速排序是不稳定的排序算法,即相等的元素可能在排序过程中改变相对位置。尽管如此,快速排序仍然因其高效的平均性能而在实际应用中广泛使用。在Python3中,可以通过递归或迭代的方式实现快速排序算法,但为了避免额外的空间开销,通常会采用原地排序的方式来实现。
【作品名称】:基于51单片机的出租车计价器(昼夜) 含(程序、仿真图、流程图、原理图) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 出租车计价器: 1、不同情况具有不同的收费标准,具有白天和夜晚不同的计价能力 2、能进行手动修改单价 3、具有数据的复位功能(起步价,起步公里数,里程单价,白天晚上不一样) 4、能够在掉电的情况下存储单价等数据 5、步进电机模拟里程,一圈表示一里路
2024年中国API 11P往复式气体压缩机行业研究报告
附件是Windows 10系统上安装和配置Tomcat的步骤,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!
此试题是考试后回忆版本,你会发现是惊喜。恭喜你考个好成绩。
数据库+人大金仓+Linux系统安装
大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,2023年美赛特等奖O奖论文
opencv-python-4.5.4.60-cp36-cp36m-win-amd64.whl
减肥管理,全球前10强生产商排名及市场份额
内容概要:《上海大学大学生创新创业训练计划申请书(创新训练项目)》是用于申请参加上海大学的大学生创新创业训练计划的申请书,旨在帮助学生提出创新项目计划,获得培训和支持,促进学生创新创业能力的提升。 适用人群:适合上海大学的在校大学生,特别是对创新创业感兴趣、有创新想法和创业计划的学生,希望通过该计划获得指导和资源支持,实现自己的创业梦想。 使用场景及目标:申请书的使用场景是为了参加上海大学的大学生创新创业训练计划,目标是通过提交详细的创新项目计划,获得评审通过并获得培训、指导和资金支持,从而推动学生的创新创业实践和能力提升。 其他说明:申请书应包括清晰的创新项目描述、项目可行性分析、预期目标和计划、团队介绍等内容,以展现学生的创新能力和项目潜力。申请书的撰写需要认真准备,体现出学生对创新创业的热情和才华,以提高申请成功的机会。
IEC 60364-7-716-2023 低压电气装置.第7-716部分:特殊装置或场所的要求.信息和通信技术(ICT)电缆基础设施上的ELV直流配电.pdf