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 }
第二步建立序列化对象

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 }
第三步建立客户端代码

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(); } }
第四部建立客户端线程

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(); } } }
好大功告成,启动服务端,服务端为被监控端。然后启动客户端客户端为监控端。可以自己再改改一对多或者多对多
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)