首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 遠程桌面控制完整實現 (Socket + Robot + 序列化圖片傳輸)

     編輯:Java 相關知識

架構設計

  • 控制端:ServerSocket 監聽,接收被控端圖片流,顯示於 JLabel;監聽本地鍵鼠事件,序列化為 InputEvent 發送。
  • 被控端:Socket 連接控制端,Robot 截屏 → 序列化 → 發送;接收 InputEvent → Robot 重放操作。
  • 通訊協議:ObjectOutputStream/InputStream 傳輸可序列化對象 (圖片用自定義 Message 封裝 byte[])。

核心類

可序列化圖片封裝

public class Message implements Serializable {
    private String fileName; private long fileLength; private byte[] fileContent;
    // 構造、getter/setter
}

控制端關鍵邏輯

// 接收圖片線程
Message msg = (Message) ois.readObject();
FileOutputStream fos = new FileOutputStream("temp/" + msg.getFileName());
fos.write(msg.getFileContent());
BufferedImage img = ImageIO.read(new FileInputStream("temp/" + msg.getFileName()));
// 縮放顯示
imageLabel.setIcon(new ImageIcon(resize(img, 800, 600)));

// 發送鍵鼠事件
frame.addMouseListener(e -> send(e));
frame.addMouseMotionListener(e -> send(e));
frame.addKeyListener(e -> send(e));
frame.addMouseWheelListener(e -> send(e));

void send(InputEvent e) { oos.writeObject(e); oos.flush(); }

被控端關鍵邏輯

// 截屏發送循環
Robot robot = new Robot();
Rectangle rect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
for (int i=0; i<50; i++) {
    BufferedImage capture = robot.createScreenCapture(rect);
    ImageIO.write(capture, "jpeg", new FileOutputStream("temp/shot" + i + ".jpeg"));
    oos.writeObject(new Message("temp/shot" + i + ".jpeg"));
    oos.flush();
}

// 接收事件重放
while (true) {
    InputEvent e = (InputEvent) ois.readObject();
    handle(robot, e);
}

void handle(Robot r, InputEvent e) {
    switch (e.getID()) {
        case MouseEvent.MOUSE_MOVED: 
            MouseEvent me = (MouseEvent) e; r.mouseMove(me.getX(), me.getY()); break;
        case MouseEvent.MOUSE_PRESSED:
            me = (MouseEvent) e; r.mousePress(getMask(me.getButton())); break;
        case MouseEvent.MOUSE_RELEASED:
            me = (MouseEvent) e; r.mouseRelease(getMask(me.getButton())); break;
        case MouseEvent.MOUSE_WHEEL:
            r.mouseWheel(((MouseWheelEvent)e).getWheelRotation()); break;
        case KeyEvent.KEY_PRESSED:
            r.keyPress(((KeyEvent)e).getKeyCode()); break;
        case KeyEvent.KEY_RELEASED:
            r.keyRelease(((KeyEvent)e).getKeyCode()); break;
    }
}
int getMask(int btn) { return btn==MouseEvent.BUTTON1?InputEvent.BUTTON1_MASK:InputEvent.BUTTON3_MASK; }

部署步驟

  1. 編譯雙端代碼,確保類路徑一致 (Message 類同包名)。
  2. 先啟動控制端 (ServerSocket),再啟動被控端 (連接控制端 IP)。
  3. 控制端窗口獲取焦點後,鍵鼠操作即同步到被控端。

局限與改進

  • 輪詢截圖延遲高,建議改用 JNA/DirectX Hook 或 VNC 協議 (RFB)。
  • 圖片臨時文件落盤慢,改用內存 ByteArrayOutputStream 直接序列化 byte[]。
  • 無加密、無認證,生產需加 TLS/SSL 與密碼驗證。
  • 跨分辨率縮放座標映射需按比例換算。

總結

本示例演示了 Java 標準庫 (Socket, Robot, Serialization, AWT 事件) 組合實現遠程桌面原型,適合學習網絡編程與 GUI 自動化原理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved