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

BufferedImage screenshot =

(newRobot()).createScreenCapture(

newRectangle(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=newFile("temp.png");

FileOutputStream fileout=newFileOutputStream(file);

ImageIO.write(image,"png",fileout);

fileout.close();

//读取图像

FileInputStream fileIn=newFileInputStream(file);

intlen=(int)file.length();

//建立字节数组

byte[] buf=newbyte[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("服务器停止");

}

}

publicvoidrun() {

while(flag) {

byte[] buf =newbyte[102400];

try{

imgStream = newBufferedInputStream(

socket.getInputStream());

imgStream.read(buf);

ImageIcon icon = newImageIcon(Toolkit.

getDefaultToolkit().

createImage(buf));

lab.setIcon(icon);

File file = newFile("1.jpg");

FileOutputStream fileOut = newFileOutputStream(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();

}

}

}

......

}

//内部类,主要功能监听鼠标事件。记录坐标。

classkeyAdapetextendsKeyAdapter

{ //键盘监听适配器

publicvoidkeyTyped(KeyEvent e) {

if(e.getKeyChar() ==27) {//按ESC键

Object[] options = {

"确定",

"取消"};

intn = 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);

}

}

}

}

publicvoidmouseClicked(MouseEvent e) {

System.out.println("双击了鼠标");

intx = e.getX();

inty = e.getY();

if(tempSocket !=null) {

newCommandMsg("2", tempSocket, x, y).start();

}

}

publicvoidmousePressed(MouseEvent e) {

if(e.BUTTON1 == MouseEvent.BUTTON1) {

System.out.println("你按了鼠标左键~~~~~~~~~~~");

intx = e.getX();

inty = e.getY();

if(tempSocket !=null) {

newCommandMsg("3", tempSocket, x, y).start();

}

}

}

......

}

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

public void run() {

out.println(eventType + "," + x + "," + y);

out.flush();

}

publicvoidrun() {

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();

}

}

}

publicvoidrun() {

while(flag) {

try{

String s = in.readLine();

decode(s);

switch(method) {

//这里的man实际也是Robot的一个实例。

case1:

man.mouseMove(x, y);

break;

case2:

man.mouseMove(x, y);

man.mousePress(InputEvent.BUTTON1_MASK);

man.mouseRelease(InputEvent.BUTTON1_MASK);

break;

case3:

man.mousePress(InputEvent.BUTTON1_MASK);

break;

case4:

man.mouseRelease(InputEvent.BUTTON1_MASK);

break;

default:

break;

}

} catch(IOException exe) {

ThreadInfo.CoopIsLive=false;

flag=false;

exe.printStackTrace();

}

}

}

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

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

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

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

  2. Java反射设置list的属性值_利用java反射比较两个实体有哪些属性值不一样

    分享一个利用反射实现比较两个实体属性值的方法: package net.zwq1105.test; import java.beans.Introspector; import java.beans. ...

  3. 全球与中国远程监控软件市场现状及未来发展趋势

    本文研究全球及中国市场远程监控软件现状及未来发展趋势,侧重分析全球及中国市场的主要企业,同时对比北美.欧洲.日本.中国.东南亚.印度等地区的现状及未来发展趋势. 2019年全球远程监控软件市场规模达到 ...

  4. 使用.net技术实现一个简易远程监控软件(后端.net core,前端winform)

    前端实现技术:Winform 后端实现技术:asp.net core 3.1 一.前端实现 采用winform实现一个简易的后台任务程序,其功能主要是定时截屏,然后发送给服务器,并且程序在任务管理器隐 ...

  5. 免杀远程监控软件大盘点

    谈到网络安全问题,就没法不谈***联盟.而说到***,当然离不开***联盟至爱的远程监控技术.世界上的远程控制软件多如牛毛,远程控制控水平也参差不齐.远程监控水平低的达不到用户的心理需求,远程监控水平 ...

  6. Nagios远程监控软件的安装与配置详解

    Nagios远程监控软件的安装与配置详解 作者:redhat_hu Nagios是一款功能强大的网络监视工具,它可以有效的监控windows.linux.unix主机状态以及路由器交换机的网络设置,打 ...

  7. 利用VisualVm和JMX远程监控K8S里的Java进程

    在利用VisualVm和JMX远程监控Java进程和VisualVm利用SSL连接JMX的方法里介绍了如 何使用VisualVm+JMX监控远程Java进程的方法.那么如何监控一个运行在K8S集群中的 ...

  8. iMonitor 365 远程监控软件怎样管理员工电脑?

    iMonitor 365 是基于网络的一体化监控软件,用于监控远程电脑,只要有一台能够连接互联网的设备,您就可以通过浏览器随时随地监控远程电脑. iMonitor 365 通过互联网实现远程监控,它将 ...

  9. 网络人远程监控软件(Netman旗舰版) v2.311官方版

    2019独角兽企业重金招聘Python工程师标准>>> 软件名称:网络人远程监控软件(Netman旗舰版) v2.311官方版 版本:2.311更新日期:2016-06-13 大小: ...

最新文章

  1. springcloud基于ribbon的canary路由方案
  2. sessionId与cookie 的关系(百度文库)
  3. 操作系统:UNIX、Linux、IOS、Android之间的渊源
  4. timer purge_Java Timer purge()方法与示例
  5. angularjs ui-router
  6. C++虚函数的实现原理(最通俗但并不想专业的解释)
  7. 论文及文献资料的搜集好去处---子午学术论坛
  8. Windows7,网络连接错误: 依赖服务或组无法启动
  9. CCF201812-3 CIDR合并(100分)【位运算+文本】
  10. 华为鸿蒙系统后续,不负期待!鸿蒙操作系统将于6月2日正式发布,你的手机更新了吗?...
  11. h系列标签自动加了bold
  12. 我的技术博客开通了!
  13. 不断被刷新的未来——读文档有感
  14. html+移动端图片点击放大,移动端点击图片放大特效PhotoSwipe.js插件实现
  15. Unable to find instance for system
  16. linux中错误无法解析域名无法下载,Linux无法解析域名的解决办法
  17. MongoDB3.4 根据中文拼音给中文排序
  18. 磁共振计算机都是量子技术吗,IBM利用磁共振对单个原子成像,未来用于量子计算机...
  19. css html5 css3
  20. RIP路由协议中的split-horizon与split-horizon with poisoned reverse剖析

热门文章

  1. 9.广义霍夫变换——介绍、广义霍夫变换步骤、实例_1
  2. 【英语学习】【WOTD】two-bit 释义/词源/示例
  3. eclipse--基本配置
  4. java 内置锁_深入理解java内置锁(synchronized)和显式锁(ReentrantLock)
  5. 深入理解 main 方法
  6. Direct3D9 Fx/HLSL的若干条有用的笔记
  7. Deferred Shading,延迟渲染(提高渲染效率,减少多余光照计算)
  8. Unreal Engine 4 编码规范
  9. JAVA springboot ssm b2b2c多用户商城系统源码(三)SpringBoot用JdbcTemplates访问Mysql
  10. 关于插件管理器Alcatraz的一些问题