Robot+Socket+Frame抓取桌面发送数据流模仿远程连接

废话不多讲第一步建服务端代码

复制代码
 1 package com.jachs.desktop;
 2 
 3 import java.awt.Dimension;
 4 import java.awt.Rectangle;
 5 import java.awt.Robot;
 6 import java.awt.Toolkit;
 7 import java.awt.image.BufferedImage;
 8 import java.io.ByteArrayOutputStream;
 9 import java.io.ObjectOutputStream;
10 import java.net.ServerSocket;
11 import java.net.Socket;
12 
13 import javax.imageio.ImageIO;
14 
15 import com.jachs.desktop.entity.Pictrue;
16 /****
17  * 服務端
18  * @author Jachs
19  *
20  */
21 public class Desktop{
22     
23     public static void main(String[] args) {
24         Dimension screenSize;
25         Rectangle screenRectangle;
26         ServerSocket serverSocket;
27         Socket socket;
28         Robot robot;
29         try {
30             screenSize= Toolkit.getDefaultToolkit().getScreenSize();
31             screenRectangle= new Rectangle(screenSize);
32             robot=new Robot();
33             
34             serverSocket=new ServerSocket(22222);
35             socket= serverSocket.accept();
36             System.out.println("in");
37             BufferedImage image;
38             ByteArrayOutputStream arrayOutputStream;
39             Pictrue pictrue;
40             ObjectOutputStream objectOutputStream;
41             while(true){
42                 image= robot.createScreenCapture(screenRectangle);
43                 arrayOutputStream=new ByteArrayOutputStream();
44                 ImageIO.write(image, "jpg", arrayOutputStream);
45                 
46                 pictrue=new Pictrue(arrayOutputStream.size(),arrayOutputStream.toByteArray());
47                 objectOutputStream=new ObjectOutputStream(socket.getOutputStream());
48                 objectOutputStream.writeObject(pictrue);
49                 Thread.sleep(100);
50             }
51         } catch (Exception e) {
52             e.printStackTrace();
53         }finally {
54         }
55     }
56 }
View Code
复制代码

第二步建立序列化对象

复制代码
 1 package com.jachs.desktop.entity;
 2 
 3 import java.io.Serializable;
 4 /****
 5  * 圖片對象
 6  * @author Jachs
 7  *
 8  */
 9 public class Pictrue implements Serializable{
10     private int size;
11     private byte[] data;
12     public Pictrue() {
13         super();
14     }
15     public Pictrue(int size, byte[] data) {
16         super();
17         this.size = size;
18         this.data = data;
19     }
20     public int getSize() {
21         return size;
22     }
23     public void setSize(int size) {
24         this.size = size;
25     }
26     public byte[] getData() {
27         return data;
28     }
29     public void setData(byte[] data) {
30         this.data = data;
31     }
32 }
View Code
复制代码

第三步建立客户端代码

复制代码
package com.jachs.desktop;

import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.UnknownHostException;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

import org.apache.commons.io.IOUtils;
/****
 * 客戶展示端
 * @author Jachs
 *
 */
public class ShowPictrue {
    
    static Frame f = new Frame();
    static JLabel imgLabel;
    static ImageIcon img;
    public static void main(String[] args) throws UnknownHostException, IOException {
        // 关闭窗体
        f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        f.setTitle("抓取桌面");// 添加标题
        f.setSize(800, 800);// 设置窗体的尺寸
        f.setLocation(10, 20);// 设置窗体出现坐标
        f.setLayout(null);// 清除窗体默认布局
        f.setIconImage(Toolkit.getDefaultToolkit().getImage(new File("").getAbsolutePath()+File.separator+"src"+File.separator+"main"+File.separator+"java"+File.separator+"image"+File.separator+"ico.png"));// 设置图标
//        f.setResizable(false);// 禁止窗体改变尺寸
        
        
        InputStream is=ShowPictrue.class.getResourceAsStream("/image/backgroundDefault.png");
        ByteArrayOutputStream arrayOutputStream=new ByteArrayOutputStream();
        IOUtils.copy(is, arrayOutputStream);
        img = new ImageIcon(arrayOutputStream.toByteArray());
        
        imgLabel = new JLabel(img);
        imgLabel.setBounds(0, 0, img.getIconWidth(), img.getIconHeight());
        
        f.add(imgLabel);
        f.setVisible(true);//设置窗体的可见性
        
        new Thread(new WriterPictrue()).start();
    }


}
View Code
复制代码

第四部建立客户端线程

复制代码
package com.jachs.desktop;

import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.net.Socket;

import javax.swing.ImageIcon;

import com.jachs.desktop.entity.Pictrue;
/****
 * 客戶端寫入線程
 * @author Jachs
 *
 */
public class WriterPictrue implements Runnable{

    public void run() {
        ObjectInputStream inputStream;
        Pictrue pictrue;
        ByteArrayOutputStream arrayOutputStream;
        try{
            Socket socket=new Socket("127.0.0.1", 22222);
            while(true){
                inputStream=new ObjectInputStream(socket.getInputStream());
                pictrue= (Pictrue) inputStream.readObject();
                
                arrayOutputStream=new ByteArrayOutputStream();
                arrayOutputStream.write(pictrue.getData(), 0, pictrue.getSize());
                ShowPictrue.img = new ImageIcon(arrayOutputStream.toByteArray());
                
                ShowPictrue.imgLabel.setIcon(ShowPictrue.img);
                ShowPictrue.imgLabel.setBounds(0, 0, ShowPictrue.img.getIconWidth(), ShowPictrue.img.getIconHeight());
                ShowPictrue.imgLabel.repaint();
//                ShowPictrue.f.repaint();
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

}
View Code
复制代码

好大功告成,启动服务端,服务端为被监控端。然后启动客户端客户端为监控端。可以自己再改改一对多或者多对多

posted @   Jachs  阅读(263)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
人生而自由,却无往不在枷锁中。