一般的远程监控软件都是用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_利用java实现一个简单的远程监控程序相关推荐

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

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

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

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

  3. dbms java_用Java实现一个简单的DBMS(总结)

    时间:2020/1/16 写这个DBMS(说DBMS夸张了,应该是一个控制台程序)的起因是数据库实践老师布置的一个大作业,先贴上GitHub地址: https://github.com/machi12 ...

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

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

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

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

  6. 缓存类java_用Java写一个简单的缓存操作类

    前言 使用缓存已经是开发中老生常谈的一件事了,常用专门处理缓存的工具比如Redis.MemCache等,但是有些时候可能需要一些简单的缓存处理,没必要用上这种专门的缓存工具,那么自己写一个缓存类最合适 ...

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

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

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

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

  9. android实现计算器功能吗,利用Android实现一个简单的计算器功能

    利用Android实现一个简单的计算器功能 发布时间:2020-11-20 16:25:01 来源:亿速云 阅读:90 作者:Leah 今天就跟大家聊聊有关利用Android实现一个简单的计算器功能, ...

最新文章

  1. boost::mp11::tuple_apply相关用法的测试程序
  2. SpringBoot_配置-@Conditional自动配置报告
  3. nginx向响应内容中追加内容(ngx_http_addition_module模块)
  4. sqlyog如何设置.时提示字段名_雷神新用户手册:拿到新电脑时如何简易设置参数!...
  5. Qt ftp 文件上传工具开发
  6. c简单的链表错误及改正
  7. ThreadLocal的练习代码
  8. 我的世界java加入更多床_《我的世界》床的N种玩法,教你如何更快地入眠
  9. 第一节:用Cube学32之简单IO口操作(点灯及按键)
  10. 【渝粤教育】国家开放大学2019年春季 1013金融统计分析 参考试题
  11. NVMe驱动详解系列——第一部分:NVMe驱动初始化和注销
  12. NBU3.2及以上版本收集DataCollect和NBSU等日志的统一方法
  13. 【书摘】批判性思维工具
  14. PS怎么做出水彩油画喷溅效果图片
  15. 服务器系统怎么安装网卡驱动,网卡驱动怎么安装,教您网卡驱动的安装操作
  16. 【NISP一级】考前必刷九套卷(九)
  17. firefox 无法启动
  18. Node.js -- JavaScript的运行环境
  19. table表格数据绑定
  20. 聊聊关于使用逻辑斯蒂回归的使用方法

热门文章

  1. 2014女生网名伤感 夏丢弃了南城
  2. 看看清华的同学在四年的大学中干什么吧,非常值得学习
  3. IDEA 设置类名和方法名
  4. Python Pymem 游戏内存基址读取修改 - 获取游戏DLL模块基址
  5. 考勤表生成器(区分节假日版本)
  6. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java美妆商城系统l5y41
  7. GTX1660Ti 本地部署 Stable Diffusion踩坑记录
  8. 国内“谁”能实现chatgpt,以及对MOSS、ChatYuan算法侧简评
  9. 阿里CTO:阿里是世界领先的大数据公司
  10. linux shell 网盘,linux shell脚本编写百度网盘下载无法运行