一般的远程监控软件都是用c或者c++等语言开发的,而使用java如何来实现相同的功能呢。
首先我们先介绍一下一个简单的远程监控程序的实现原理。
功能一,远程屏幕监视
(1) 必须要有监控端与被监控端,而且程序保持启动。
(2) 被监控端获取本机的屏幕截屏发图给监控端。
(3) 监控端在本地窗口中显示被监控端发送过来的图像。
(4) (2)(3)步骤重复执行,这时在监控端即可实时监视到被监控端的桌面操作了。
功能二,远程控制
(1) 必须要有监控端与被监控端,而且程序保持启动。
(2) 在监控端监视窗体上执行鼠标点击事件。
(3) 记录步骤 (2)中的鼠标点击的坐标,及键值发送到被监控端。
(4) 被监控接受鼠标坐标,及键值,然后再本地屏幕上模拟同样的点击动作。
OK,现在看下具体的java与语言是如何实现上述功能的。
使用java语言要实现截屏的功能就要依靠java类库中的一个有趣的类
java.awt.Robot类【俗称Java机器人】了
功能一,远程屏幕监视
//『客户端』抓取屏幕快照GuiCamera.java
Java代码
1BufferedImage screenshot =
2 (new Robot()).createScreenCapture(
3 new Rectangle(0, 0, (int) size.getWidth(),
4 (int) size.getHeight()));
//『客户端』发送快照 SendThread.java
Java代码
5image=gc.snapShot();
6 //保存为临时文件
7 File file=new
8 FileOutputStream fileout=new FileOutputStream(file);
9 ImageIO.write(image,"png",fileout);
10 fileout.close();
11
12 //读取图像
13 FileInputStream fileIn=new FileInputStream(file);
14 int len=(int)file.length();
15
16 //建立字节数组
17 byte[] buf=new byte[len];
18 fileIn.read(buf,0,len);
19
20 //发送
21 out.write(buf,0,len);
22 out.flush();
23
24 //间隔500毫秒
25 Thread.sleep(500);
//『监控端』接受图像,Snap.java
Java代码
26public void run() {
27while (flag) {
28 byte[] buf = new byte[102400];
29 try {
30
31 imgStream = new BufferedInputStream(
32 socket.getInputStream());
33 imgStream.read(buf);
34 ImageIcon icon = new ImageIcon(Toolkit.
35 getDefaultToolkit().
36 createImage(buf));
37 lab.setIcon(icon);
38
39 File file = new
40 FileOutputStream fileOut = new FileOutputStream(file);
41 fileOut.write(buf);
42 fileOut.close();
43
44 repaint();
45 setVisible(true);
46 System.out.println("读取图象成功!");
47 } catch (Exception ex) {
48 ex.printStackTrace();
49 flag = false;
50 }
51 }
52 System.out.println("服务器停止");
53 }
功能二,远程控制
『监控端』记录鼠标操作Snap.java
Java代码
54
55//内部类,主要功能监听鼠标事件。记录坐标。
56class keyAdapet extends KeyAdapter
57 { //键盘监听适配器
58 public void keyTyped(KeyEvent e) {
59
60 if (e.getKeyChar() == 27) { //按ESC键
61 Object[] options = {
62 "确定",
63 "取消"};
int n = JOptionPane.showOptionDialog(null,
65 "是否退出程序?",
66 "远程监控系统",
67 JOptionPane.OK_CANCEL_OPTION,
68 JOptionPane.QUESTION_MESSAGE,
69 null, //don't use a custom Icon
70 options, //the titles of buttons
71 options[0]);
72 if (0 == n) {
73 System.exit(0);
74 }
75 }
76
77 }
78 }
79
80
81 public void mouseClicked(MouseEvent e) {
82
83 System.out.println("双击了鼠标");
84 int x = e.getX();
85 int y = e.getY();
86 if (tempSocket != null) {
87 new CommandMsg("2", tempSocket, x, y).start();
88 }
}
90
91 public void mousePressed(MouseEvent e) {
92 if (e.BUTTON1 == MouseEvent.BUTTON1) {
93 System.out.println("你按了鼠标左键~~~~~~~~~~~");
94 int x = e.getX();
95 int y = e.getY();
96 if (tempSocket != null) {
97 new CommandMsg("3", tempSocket, x, y).start();
98 }
99 }
100 }
101
102 ......
103 }
『监控端』发送坐标Snap.java
Java代码
104public void run() {
105 out.println(eventType +
106 out.flush();
107}
『客户端』获取鼠标坐标后,在本机相同坐标位置模拟一个鼠标点击操作 Coop.java
Java代码
108public void run() {
109 while (flag) {
110 try {
111 String s = in.readLine();
112 decode(s);
113 switch (method) {
114 //这里的man实际也是Robot的一个实例。
115 case 1:
116 man.mouseMove(x, y);
117 break;
118 case 2:
119 man.mouseMove(x, y);
120 man.mousePress(InputEvent.BUTTON1_MASK);
121 man.mouseRelease(InputEvent.BUTTON1_MASK);
122 break;
123 case 3:
124 man.mousePress(InputEvent.BUTTON1_MASK);
125 break;
126 case 4:
127 man.mouseRelease(InputEvent.BUTTON1_MASK);
128 break;
129 default:
130 break;
131 }
132
133 } catch (IOException exe) {
134 ThreadInfo.CoopIsLive=false;
135 flag=false;
136 exe.printStackTrace();
137 }
138 }
139 }
代码的部分就介绍到这里,由于java语言的一些,本实例仅作为演示。有感兴趣的朋友可以下载附件中的程序做进一步参考。
java远程监控.rar(224.7 KB)下载本文