java实现远程桌面监控

java里面的Robot类可以完成截图的功能,借助于这点,我尝试着做了一个简陋的桌面监控程序,运行了下,感觉速度还可以,还有很大的优化空间的,比如用udp协议取代tcp等。代码也写的不是很优雅,只在娱乐了。
实现原理其实很简单,在被监视者的机器上,运行一个线程,每隔一段时间就自动截图,并把截图压缩发送到指定的机器上;在监视机器上,也是运行一个线程,接收发送过来的图片包,解压,并绘制到当前的窗口上。这样就基本完成了。
public class Server extends Thread {
private Dimension screenSize;
private Rectangle rectangle;
private Robot robot;

public Server() {
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
rectangle = new Rectangle(screenSize);// 可以指定捕获屏幕区域
try {
robot = new Robot();
} catch (Exception e) {
e.printStackTrace();
System.out.println(e);
}
}

public void run() {
ZipOutputStream os = null;
Socket socket = null;
while (true) {
try {
socket = new Socket("192.168.1.100", 5001);// 连接远程IP
BufferedImage image = robot.createScreenCapture(rectangle);// 捕获制定屏幕矩形区域
os = new ZipOutputStream(socket.getOutputStream());// 加入压缩流
// os = new ZipOutputStream(new FileOutputStream("C:/1.zip"));

os.setLevel(9);
os.putNextEntry(new ZipEntry("test.jpg"));
JPEGCodec.createJPEGEncoder(os).encode(image);// 图像编码成JPEG
os.close();
Thread.sleep(50);// 每秒20帧
} catch (Exception e) {
e.printStackTrace();
} finally {
if (os != null) {
try {
os.close();
} catch (Exception ioe) {
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
}
}
}
}
}

public static void main(String[] args) {
new Server().start();
}
}

public class Client extends JFrame {
private static final long serialVersionUID = 1L;
Dimension screenSize;

public Client() {
super();
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setSize(800, 640);
Screen p = new Screen();
Container c = this.getContentPane();
c.setLayout(new BorderLayout());
c.add(p, SwingConstants.CENTER);
new Thread(p).start();
SwingUtilities.invokeLater(new Runnable(){
public void run() {
setVisible(true);
}});
}

public static void main(String[] args) {
new Client();
}

class Screen extends JPanel implements Runnable {

private static final long serialVersionUID = 1L;
private Image cimage;

public void run() {
ServerSocket ss = null;
try {
ss = new ServerSocket(5001);// 探听5001端口的连接
while (true) {
Socket s = null;
try {
s = ss.accept();
ZipInputStream zis = new ZipInputStream(s
.getInputStream());
zis.getNextEntry();
cimage = ImageIO.read(zis);// 把ZIP流转换为图片
repaint();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (s != null) {
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
} catch (Exception e) {
} finally {
if (ss != null) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

public Screen() {
super();
this.setLayout(null);
}

public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(cimage, 0, 0, null);
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值