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