利用 java.awt.Robot 擷取伺服器螢幕畫面,封裝為 Servlet 輸出 JPEG 圖片流,瀏覽器定時刷新即可實現輕量級「遠端桌面監控」。無需安裝 Agent,適合內網伺服器快速巡檢。
@WebServlet("/snapshot")
public class SnapshotServlet extends HttpServlet {
private static final String CONTENT_TYPE = "image/jpeg";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType(CONTENT_TYPE);
resp.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
try {
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
Rectangle bounds = new Rectangle(0, 0, screen.width, screen.height);
BufferedImage img = new Robot().createScreenCapture(bounds);
try (ServletOutputStream out = resp.getOutputStream()) {
ImageIO.write(img, "jpg", out);
out.flush();
}
} catch (AWTException | IOException e) {
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "截圖失敗: " + e.getMessage());
}
}
}
<img id="screen" src="/snapshot" width="800" />
<script>
setInterval(() => {
document.getElementById('screen').src = '/snapshot?' + Date.now(); // 防快取
}, 2000); // 每 2 秒刷新
</script>
canvas 或 img 綁定 click/mousemove 事件,將座標相對圖片比例換算為螢幕絕對座標。/robot-control Servlet,參數 action=click|move|type&x=...&y=...&key=...。Robot.mouseMove(x,y)、mousePress/Release、keyPress/Release 執行操作。Robot 需要圖形介面環境(Headless 模式下會拋 AWTException),Linux 伺服器需安裝 Xvfb 或運行於桌面 Session。getScreenSize() 僅返回主螢幕,需用 GraphicsEnvironment.getScreenDevices() 遍歷。--add-modules java.desktop 或在 module-info.java requires java.desktop;。| 方案 | 優點 | 缺點 |
|---|---|---|
| Apache Guacamole | HTML5 無客戶端、支援 RDP/VNC/SSH、認證授權完善 | 部署相對複雜 |
| noVNC + Websockify | 輕量、標準 RFB 協議 | 需伺服器端運行 VNC Server |
| Chrome Remote Desktop / TeamViewer | 穿透 NAT、商業級可靠 | 閉源、需安裝 Agent |