利用java实现一个简单的远程监控程序

一般的远程监控软件都是用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

利用java实现一个简单的远程监控程序,布布扣,bubuko.com

时间: 2024-10-01 07:37:26

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

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

定义: 所谓链表就是指在某节点存储数据的过程中还要有一个属性用来指向下一个链表节点,这样的数据存储方式叫做链表 链表优缺点: 优点:易于存储和删除 缺点:查询起来较麻烦 下面我们用java来实现如下链表结构: 首先定义节点类: 复制代码package LinkTest;/** 链表节点类 @author admin */public class Node {private int value;//存储数据private Node next;//下一个节点/** 定义构造器 @param vlau

利用java servlet实现简单的web请求过滤和跳转

今日有两个微信web项目合并了,但是还有些链接指向废弃的项目,另外不想在服务器上运行两份相同web项目(1.影响性能.2.维护升级容易出错),因此决定写一个简单链接跳转的项目,spring的filter过滤器可以实现,但想想spring干这个有点大材小用,想到java的servlet可以支持通配符,因此用servlet写了一个简单的跳转程序,总共花了不到一小时的时间.废话少说上代码: 1 /** 2 * Servlet implementation class Default 3 */ 4 @W

利用VS2008发布一个简单的webservice

一个开发好的webservice,怎样发布出去,供其他电脑访问呢? 本文将介绍如何发布一个简单的webservice,其中的内容都是在网上查看别人文章,自己仿照着做了一遍,因此,难免会发生错误,如果发现错误,希望各位能够指出,谢谢!! 1.准备工作 1.1一个C#开发好的webservice实例.参考下面例子: http://www.cnblogs.com/LCCRNblog/p/3716406.html 1.2安装好IIS,安装过程: http://www.cnblogs.com/LCCRNb

java创建一个简单的小框架frame

import java.awt.*; import javax.swing.*; public class SimpleFrameTest { public static void main(String[] args) { EventQueue.invokeLater(new Runnable(){ // 开一个线程 public void run() { SimpleFrame frame = new SimpleFrame(); frame.setTitle("记事本"); //

利用java开发一个双击执行的小程序

之前我们利用java写了很多东西,但是好像都没有什么实际意义. 因为有意义桌面小程序怎么都得有个界面,可是界面又不太好搞.或者 了解到这一层的人就少之又少了. 呀,是不是还得开辟一些版面来介绍awt和 swing... 算了 先把这个 双击执行的小程序 贡献出来. 这次 在分享一下源代码[以前还没有上传过源代码,布置怎么个搞法] 要求是: 输入一个 后缀名,然后输入所在目录,然后 点击查找,比如我们可以 输入F:\,然后查找 F盘下面的所有后缀名为比如.pdf 举例: 主要是 看了很多 资源,然

如何利用CEF3创建一个简单的应用程序 (Windows Platform)

1. 说明 这篇文章主要讲述如何利用CEF3来创建一个简单的应用程序,引用的是1535及以上版本中包含的 Cefsimple 项目例子.如果想知道关于CEF3更多的使用方法,可以去访问 GeneralUsage. 2. 开始 首先,根据自身所使用的开发平台,可以去 这里 下载对应的发布版本.针对这个教程,我们需要下载1750或者更新的版本.当前支持的平台有Windows, Linux和Mac OS X.每一个版本都包含了当在特定平台上编译特定版本CEF3时所需要的所有文件和资源.您可以通过包含在

一个简单的远程溢出漏洞分析

人生第一个漏洞分析,好激动. 因为从来没有接触过漏洞分析方面,以前也只是看过一点书,所以一直想找个东西练练手,结果翻到了看雪Exploit me的题目,本来以为会很难,结果还是很基础的,适合我这样的新手练手. http://bbs.pediy.com/showthread.php?t=56998 进入正题 首先拿到了一个Windows程序,拖到IDA里打算看一下,结果发现程序逻辑出乎意料的简单.就是一个很常规的SOCKET流程带有一些错误处理. 下面详细说明. mov ebp,eax test

Java写一个简单学生管理系统

其实作为一名Java的程序猿,无论你是初学也好,大神也罢,学生管理系统一直都是一个非常好的例子,初学者主要是用数组.List等等来写出一个简易的学生管理系统,二.牛逼一点的大神则用数据库+swing来做一个有界面的学生管理系统.其实都并不会太难. 今天我就先写一个简单的用List来实现学生管理系统: 首先,管理系统是针对学生对象的,所以我们先把学生对象就写出来: package bean; public class Student { String name; String studentId;

如何利用CEF3创建一个简单的应用程序

说明: 这篇文章主要讲述如何利用CEF3来创建一个简单的应用程序,它参考了1535及以上版本中包含的 Cefsimple 项目例子.如果想知道关于CEF3更多的使用方法,可以去访问 GeneralUsage. 开始: 首先,根据自身所使用的开发平台,可以去这里下载对应的发布版本.针对这个教程,我们需要下载1750或者更新的版本.当前支持的平台有Windows, Linux和Mac OS X.每一个版本都包含了当在特定平台上编译特定版本CEF3时所需要的所有文件和资源.您可以通过包含在里边的 RE