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

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

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

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

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

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

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

//『监控端』接受图像,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("服务器停止");
            }
}

功能二,远程控制

『监控端』记录鼠标操作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();
                }
            }
        }

......
   }

『监控端』发送坐标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

利用java实现一个简单的远程监控程序的更多相关文章

  1. 利用java实现一个简单的链表结构

    *博客搬家:初版发布于 2014/07/04 定义: 所谓链表就是指在某节点存储数据的过程中还要有一个属性用来指向下一个链表节点,这样的数据存储方式叫做链表 链表优缺点: 优点:易于存储和删除 缺点: ...

  2. 利用ANTLR4实现一个简单的四则运算计算器

    利用ANTLR4实现一个简单的四则运算计算器 ANTLR4介绍 ANTLR能够自动地帮助你完成词法分析和语法分析的工作, 免去了手写去写词法分析器和语法分析器的麻烦 它是基于LL(k)的, 以递归下降 ...

  3. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  4. 使用 java 实现一个简单的 markdown 语法解析器

    1. 什么是 markdown Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的 ...

  5. java:jsp: 一个简单的自定义标签 tld

    java:jsp: 一个简单的自定义标签 tld 请注意,uri都是:http://www.tag.com/mytag,保持统一,要不然报错,不能访问 tld文件 <?xml version=& ...

  6. 利用 nodeJS 搭建一个简单的Web服务器(转)

    下面的代码演示如何利用 nodeJS 搭建一个简单的Web服务器: 1. 文件 WebServer.js: //-------------------------------------------- ...

  7. 使用JAVA写一个简单的日历

    JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateF ...

  8. Java实现一个简单的网络爬虫

    Java实现一个简单的网络爬虫 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWri ...

  9. Java实现一个简单的文件上传案例

    Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ...

随机推荐

  1. IO 流—>>>补充

    流操作规律: 示例:1. 源: 键盘录入 目的: 控制台 2.源:文件 目的:控制台 3.源: 键盘录入 目的: 文件 基本规律: 面对流对象很多,不知道用哪一个的时候: 通过两个明确来完成 1.明确 ...

  2. Hibernate查询之Criteria查询

    转自:http://www.cnblogs.com/Laupaul/archive/2012/02/15/2353194.html Criteria是一种比hql更面向对象的查询方式.Criteria ...

  3. Spring基于注解的Cache支持

    Spring为我们提供了几个注解来支持Spring Cache.其核心主要是@Cacheable和@CacheEvict.使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回 ...

  4. 在地图上添加POI

    使用Tangram的Marker, 可以在地图上做各种标记, 效果图: Tangram是通过Marker在地图上添加标记的,Marker分Point, Polyline和Polygon三种, 分别对应 ...

  5. 设计模式24---设计模式之职责链模式(Chain of Responsibility)(行为型)

    1.职责链模式讲解 1.1职责链定义 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 1.2职责链模式 ...

  6. 用Gitosis搭建Git服务器(经典资料)

    该文档介绍了用Gitosis自己搭建Git服务器,文章来自于<Git权威指南>一书的第31章,讲述详细易懂易操作,是搭建Git服务器绝好资料! 下载地址:http://download.c ...

  7. HDU 5046 Airport ( Dancing Links 反复覆盖 )

    今年上海网络赛的一道题目 , 跟 HDU 2295 如出一辙 . 就是距离的计算一个是欧几里得距离 , 一个是曼哈顿距离 学完DLX感觉这题好水 ,就是一个裸的反复覆盖 注意下别溢出即可了 #incl ...

  8. oracle授权另外一个用户访问自己创建的数据对象

    oracle安装好之后,有一个默认的scott用户,该用户有一个默认的emp表,怎样让新创建的用户也能够访问这个表呢? 授权xiaoming这个用户访问emp表,但是xiaoming只有select权 ...

  9. sharepoint 模糊搜索

    看资料知道sharepoint中模糊搜索可以用FullTextSqlQuery,因此我们就可以业务需求进行模糊搜索的自定义开发,可惜前一段时间自己写了一个模糊搜索,发现了一个问题,暂不知道如何过滤管理 ...

  10. CentOS 6.7编译安装PHP7

    1.首先配置好编译环境 yum update && yum upgrade yum groupinstall "Development Tools" yum ins ...