首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

远程桌面组件AjaxVNC的施用和原理讲解

2012-09-09 
远程桌面组件AjaxVNC的应用和原理讲解???? 最近由于项目需要学习远程监控软件,在网上查看网友关于监控软件

远程桌面组件AjaxVNC的应用和原理讲解

???? 最近由于项目需要学习远程监控软件,在网上查看网友关于监控软件的设计方案,同时查找是否有第三方软件提供自己集成到项目中应用组件。有童鞋说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:特定的端口。

?

?

?远程桌面组件AjaxVNC的施用和原理讲解

热点排行