一般的远程监控软件都是用c或者c++等语言开发的,而使用java如何来实现相同的功能呢。

首先我们先介绍一下一个简单的远程监控程序的实现原理。

功能一,远程屏幕监视
(1) 必须要有监控端与被监控端,而且程序保持启动。
(2) 被监控端获取本机的屏幕截屏发图给监控端。
(3) 监控端在本地窗口中显示被监控端发送过来的图像。
(4) (2)(3)步骤重复执行,这时在监控端即可实时监视到被监控端的桌面操作了。

功能二,远程控制
(1) 必须要有监控端与被监控端,而且程序保持启动。
(2) 在监控端监视窗体上执行鼠标点击事件。
(3) 记录步骤 (2)中的鼠标点击的坐标,及键值发送到被监控端。
(4) 被监控接受鼠标坐标,及键值,然后再本地屏幕上模拟同样的点击动作。

OK,现在看下具体的java与语言是如何实现上述功能的。

使用java语言要实现截屏的功能就要依靠java类库中的一个有趣的类
java.awt.Robot类【俗称Java机器人】了

功能一,远程屏幕监视
//『客户端』抓取屏幕快照GuiCamera.java


            BufferedImage screenshot =
                    (new Robot()).createScreenCapture(
                            new Rectangle(0, 0, (int) size.getWidth(),
                                          (int) size.getHeight()));
         
//『客户端』发送快照 SendThread.java

image=gc.snapShot();
               //保存为临时文件
               File file=new File("temp.png");
               FileOutputStream fileout=new FileOutputStream(file);
               ImageIO.write(image,"png",fileout);
               fileout.close();
              
               //读取图像
               FileInputStream fileIn=new FileInputStream(file);
               int len=(int)file.length();

//建立字节数组
               byte[] buf=new byte[len];
               fileIn.read(buf,0,len);

//发送
               out.write(buf,0,len);
               out.flush();
              
               //间隔500毫秒
               Thread.sleep(500);

image=gc.snapShot();
               //保存为临时文件
               File file=new File("temp.png");
               FileOutputStream fileout=new FileOutputStream(file);
               ImageIO.write(image,"png",fileout);
               fileout.close();
              
               //读取图像
               FileInputStream fileIn=new FileInputStream(file);
               int len=(int)file.length();

//建立字节数组
               byte[] buf=new byte[len];
               fileIn.read(buf,0,len);

//发送
               out.write(buf,0,len);
               out.flush();
              
               //间隔500毫秒
               Thread.sleep(500);

//『监控端』接受图像,Snap.java

public void run() {
 while (flag) {
                    byte[] buf = new byte[102400];
                    try {

imgStream = new BufferedInputStream(
                                socket.getInputStream());
                        imgStream.read(buf);
                        ImageIcon icon = new ImageIcon(Toolkit.
                                getDefaultToolkit().
                                createImage(buf));
                        lab.setIcon(icon);

File file = new File("1.jpg");
                        FileOutputStream fileOut = new FileOutputStream(file);
                        fileOut.write(buf);
                        fileOut.close();

repaint();
                        setVisible(true);
                        System.out.println("读取图象成功!");
                    } catch (Exception ex) {
                        ex.printStackTrace();
                        flag = false;
                    }
                }
                System.out.println("服务器停止");
            }
}

public void run() {
while (flag) {
                    byte[] buf = new byte[102400];
                    try {

imgStream = new BufferedInputStream(
                                socket.getInputStream());
                        imgStream.read(buf);
                        ImageIcon icon = new ImageIcon(Toolkit.
                                getDefaultToolkit().
                                createImage(buf));
                        lab.setIcon(icon);

File file = new File("1.jpg");
                        FileOutputStream fileOut = new FileOutputStream(file);
                        fileOut.write(buf);
                        fileOut.close();

repaint();
                        setVisible(true);
                        System.out.println("读取图象成功!");
                    } catch (Exception ex) {
                        ex.printStackTrace();
                        flag = false;
                    }
                }
                System.out.println("服务器停止");
            }
}

功能二,远程控制

『监控端』记录鼠标操作Snap.java


//内部类,主要功能监听鼠标事件。记录坐标。
class keyAdapet extends KeyAdapter
    { //键盘监听适配器
        public void keyTyped(KeyEvent e) {

if (e.getKeyChar() == 27) { //按ESC键
                Object[] options = {
                                   "确定",
                                   "取消"};
                int n = JOptionPane.showOptionDialog(null,
                        "是否退出程序?",
                        "远程监控系统",
                        JOptionPane.OK_CANCEL_OPTION,
                        JOptionPane.QUESTION_MESSAGE,
                        null, //don't use a custom Icon
                        options, //the titles of buttons
                        options[0]);
                if (0 == n) {
                    System.exit(0);
                }
            }

}
    }

public void mouseClicked(MouseEvent e) {

System.out.println("双击了鼠标");
            int x = e.getX();
            int y = e.getY();
            if (tempSocket != null) {
                new CommandMsg("2", tempSocket, x, y).start();
            }
        }

public void mousePressed(MouseEvent e) {
            if (e.BUTTON1 == MouseEvent.BUTTON1) {
                System.out.println("你按了鼠标左键~~~~~~~~~~~");
                int x = e.getX();
                int y = e.getY();
                if (tempSocket != null) {
                    new CommandMsg("3", tempSocket, x, y).start();
                }
            }
        }

......
   }

//内部类,主要功能监听鼠标事件。记录坐标。
class keyAdapet extends KeyAdapter
    { //键盘监听适配器
        public void keyTyped(KeyEvent e) {

if (e.getKeyChar() == 27) { //按ESC键
                Object[] options = {
                                   "确定",
                                   "取消"};
                int n = JOptionPane.showOptionDialog(null,
                        "是否退出程序?",
                        "远程监控系统",
                        JOptionPane.OK_CANCEL_OPTION,
                        JOptionPane.QUESTION_MESSAGE,
                        null, //don't use a custom Icon
                        options, //the titles of buttons
                        options[0]);
                if (0 == n) {
                    System.exit(0);
                }
            }

}
    }

public void mouseClicked(MouseEvent e) {

System.out.println("双击了鼠标");
            int x = e.getX();
            int y = e.getY();
            if (tempSocket != null) {
                new CommandMsg("2", tempSocket, x, y).start();
            }
        }

public void mousePressed(MouseEvent e) {
            if (e.BUTTON1 == MouseEvent.BUTTON1) {
                System.out.println("你按了鼠标左键~~~~~~~~~~~");
                int x = e.getX();
                int y = e.getY();
                if (tempSocket != null) {
                    new CommandMsg("3", tempSocket, x, y).start();
                }
            }
        }

......
   }

『监控端』发送坐标Snap.java

public void run() {
                out.println(eventType + "," + x + "," + y);
                out.flush();
}
public void run() {out.println(eventType + "," + x + "," + y);out.flush();
}

『客户端』获取鼠标坐标后,在本机相同坐标位置模拟一个鼠标点击操作 Coop.java

public void run() {
        while (flag) {
            try {
                String s = in.readLine();
                decode(s);
                switch (method) {
                //这里的man实际也是Robot的一个实例。
                case 1:
                    man.mouseMove(x, y);
                    break;
                case 2:
                    man.mouseMove(x, y);
                    man.mousePress(InputEvent.BUTTON1_MASK);
                    man.mouseRelease(InputEvent.BUTTON1_MASK);
                    break;
                case 3:
                    man.mousePress(InputEvent.BUTTON1_MASK);
                    break;
                case 4:
                    man.mouseRelease(InputEvent.BUTTON1_MASK);
                    break;
                default:
                    break;
                }

} catch (IOException exe) {
                ThreadInfo.CoopIsLive=false;
                flag=false;
                exe.printStackTrace();
            }
        }
    }

public void run() {while (flag) {try {String s = in.readLine();decode(s);switch (method) {//这里的man实际也是Robot的一个实例。case 1:man.mouseMove(x, y);break;case 2:man.mouseMove(x, y);man.mousePress(InputEvent.BUTTON1_MASK);man.mouseRelease(InputEvent.BUTTON1_MASK);break;case 3:man.mousePress(InputEvent.BUTTON1_MASK);break;case 4:man.mouseRelease(InputEvent.BUTTON1_MASK);break;default:break;}} catch (IOException exe) {ThreadInfo.CoopIsLive=false;flag=false;exe.printStackTrace();}}}

代码的部分就介绍到这里,由于java语言的一些限制,本实例仅作为演示。有感兴趣的朋友可以下载附件中的程序做进一步参考。 java远程监控.rar (224.7 KB)

原帖地址 http://www.javaeye.com/topic/200963

转载于:https://www.cnblogs.com/myfreefield/p/3782205.html

利用java实现一个简单的远程监控程序相关推荐

  1. 用java实现一个简单远程监控软件_利用java实现一个简单的远程监控程序

    一般的远程监控软件都是用c或者c++等语言开发的,而使用java如何来实现相同的功能呢. 首先我们先介绍一下一个简单的远程监控程序的实现原理. 功能一,远程屏幕监视 (1) 必须要有监控端与被监控端, ...

  2. 上网监控程序java_利用java实现一个简单的远程监控程序

    一般的远程监控软件都是用c或者c++等语言开发的,而使用java如何来实现相同的功能呢. 首先我们先介绍一下一个简单的远程监控程序的实现原理. 功能一,远程屏幕监视 (1) 必须要有监控端与被监控端, ...

  3. java完成一个学生信息调查程序_利用Java设计一个简单的学生信息管理程序

    利用Java设计一个简单的控制台学生信息管理程序 此程序可作为课设的参考,其中信息存储于文件中. 创建了学生类Student,用于存储学号等的信息.创建StudentFunction类,用于实现诸如学 ...

  4. 如何利用JAVA编写一个简单的石头剪刀布的小游戏

    楼主为了完成作业,花了一小会时间自己琢磨了一下,写出了这个石头剪刀布的小游戏. 思路很简单,就是令石头=2,剪刀=1,布=0,那么电脑随机生成一个数,分别去对应,游戏者同时也输入一个数字,也是对应着前 ...

  5. 利用java做一个简单的计算器

    共两个类.还只是完成+.-.×.÷运算而已. GUI只是用了AWT,很简单,相信一看就能懂了. Calculator.java public class Calculator{ private Str ...

  6. 从入门到入土:基于C语言采用UDP协议实现远程控制|详细说明|利用流套接字实现一个简单的远程控制系统|代码展示

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  7. 从入门到入土:基于C语言采用TCP协议实现远程控制|详细说明|利用流套接字实现一个简单的远程控制系统

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  8. java调python 监控_利用Python实现一个简单的系统监控图表

    作为运维人员,想必大家肯定都做过这样的事情:为了监控系统资源使用情况,开了若干个窗口,来回切换看输出: 只要我切得够快,性能异常点就逃不过我的眼睛! 这个时候你要是有个监控工具自然是很好的,例如我们美 ...

  9. 做一个简单的“远程”开关 ESP8266 + APP

    简单的远程开关制作(纯代码.无解析版.UDP通信) 引言 本篇文章,我们将做一个超级简单的开关,当你学会该操作后,就可以自己进行一些简单的添加.修改从而实现一些自定义的功能.你可以做一个简单的远程开关 ...

  10. 用Java实现一个简单的考试系统

    用Java实现一个简单的考试系统 需求分析 设计思路 编码实现 需求分析 该考试系统可以实现的功能和系统要求应该包括: 学生:登录.考试.考试后查看成绩 老师:出题目(往题库中添加新题目).批阅卷子( ...

最新文章

  1. 实验 4 在分支循环结构中调用自定义函数
  2. 用python画简单的动物-使用Python的turtle画小绵羊
  3. 第三方工具Jdom解析XML
  4. 『线性空间 整数线性基和异或线性基』
  5. CRM Fiori Application opptListRefreshed
  6. 1119. Pre- and Post-order Traversals (30)
  7. HTML5,CSS3,JS绘制饼图
  8. oracle sql within,Oracle SQL Model Clause
  9. python 取模是什么意思_编程语言中,取余和取模的区别到底是什么?
  10. Markdown-Latex全称量词和存在量词(对于全体、存在)
  11. matlab hough变换检测平行直线,浅谈Hough变换的平行直线检测改进方案
  12. IT人的算法书单:挖掘程序的灵魂
  13. 公制与英制长度转换 c语言,公制和英制的换算在线(在线公制转英制转换器)
  14. java判断101到200之间的素数
  15. C++ 多态性 (polymorphism)
  16. 学C++就学服务端,先把apue和unp两卷看了,接着libevent,出来找工作应该没问题
  17. 求解线性同余方程--扩展欧几里得
  18. 47、建筑设置避难间时,对避难间的要求
  19. Java-用类描述人之间的血缘关系
  20. android11.0 Launcher3 高端定制之抽屉列表固定APP显示位置

热门文章

  1. sift计算效率优化_【计算机视觉】9. 小结
  2. *第二周*数据结构实践项目一【交换】
  3. java数组基本操作
  4. 小程序之旅——第四站(模板框架)
  5. git注意事项(持续更新中)
  6. 今天提前回去吧,整理一下,为下周做好准备。
  7. 【转】健康,运动,习惯
  8. VC下关于debug和release的不同的讨论(收藏-转载)
  9. 使用 RxJava 的正确姿势
  10. linux远程安装和使用