SafeRemote 小助手:一个基于 Java 的轻量级远程控制系统

前言

在日常开发、远程协助、服务器维护或者家用电脑管理中,我们经常会遇到一种场景:
人在外面,但是需要临时操作另一台 Windows 电脑。

常见的远程控制软件虽然功能完整,但有时候也会遇到一些问题,比如:

  • 软件体积较大;
  • 需要登录第三方账号;
  • 端口和网络限制比较多;
  • 部署方式不够灵活;
  • 想自己掌握服务端和数据转发逻辑。

基于这些需求,我尝试开发了一个轻量级远程控制系统,取名为 SafeRemote 小助手
这个系统主要使用 Java + Web + 中转服务器 实现,可以通过浏览器远程查看和控制被控端电脑。

本项目仅用于个人学习、远程协助和授权设备管理,禁止用于任何未授权控制、入侵或恶意用途。


在这里插入图片描述

一、系统整体介绍

SafeRemote 小助手主要由三个部分组成:

  1. 被控端 Agent
  2. 中转服务器 Relay Server
  3. 网页控制端 Web Client

整体流程如下:

控制端浏览器  <——>  中转服务器  <——>  被控端 Agent

被控端运行后,会主动连接中转服务器并上传屏幕画面。
控制端通过浏览器访问中转服务器页面,输入对应令牌和访问密码后,就可以查看远程画面,并发送鼠标、键盘、终端命令等控制指令。

这种设计的好处是:
被控端不需要暴露在公网,只要它能访问中转服务器,就可以被授权控制端连接。


二、主要功能

目前系统已经实现了以下功能。

1. 屏幕共享

被控端可以实时采集 Windows 桌面画面,并通过中转服务器传输到网页控制端。

支持配置:

  • 帧率 FPS;
  • JPEG 图像质量;
  • 默认传输宽度;
  • 默认传输高度;
  • 缩放模式;
  • 暂停屏幕共享。

在控制端页面中,可以实时看到远程电脑的屏幕画面。


2. 鼠标控制

控制端可以通过浏览器直接操作被控端鼠标,包括:

  • 鼠标移动;
  • 左键点击;
  • 右键点击;
  • 双击;
  • 拖拽;
  • 滚轮滚动。

为了适配不同显示器比例,比如普通 16:9 屏幕、带鱼屏、多屏幕环境,系统对鼠标坐标映射进行了处理。

控制端看到的是缩放后的画面,但最终发送给被控端的是根据真实桌面分辨率换算后的坐标,从而保证点击位置更加准确。


3. 键盘输入

控制端支持向被控端发送键盘输入。

例如:

  • 在远程电脑的输入框中输入文字;
  • 操作网页搜索框;
  • 执行快捷键;
  • 粘贴剪贴板内容。

这部分的目标是尽量接近 Windows 自带远程桌面或者常见远控软件的输入体验。


4. 网页终端

系统内置了一个网页终端功能,可以在浏览器中执行被控端命令。

最开始的实现方式比较简单:
每输入一条命令,就单独启动一次进程执行。

这种方式的问题是:

cd Desktop
dir

第一条命令执行完后,第二条命令不会保留上一条的目录状态。
也就是说,它不是一个真正的交互式终端。

后来对这部分进行了改造,改成了持久化 Shell 会话。

现在终端更接近 Xshell 的体验:

  • 当前目录可以保留;
  • 环境变量状态可以保留;
  • 可以连续输入命令;
  • 输出内容实时追加到网页终端窗口;
  • 不再是“一条命令一个进程”的伪终端。

5. P2P / 局域网直连

系统预留了 P2P 与局域网直连相关配置。

当控制端和被控端处于同一局域网时,可以优先尝试直连。
如果不满足直连条件,则通过中转服务器进行转发。

被控端界面中可以配置:

  • 是否启用 P2P / 局域网直连;
  • P2P 直连端口;
  • P2P 公网地址。

这种设计可以提高局域网场景下的传输效率,减少服务器中转压力。


6. 分辨率与缩放控制

远程控制中,一个比较常见的问题就是分辨率不匹配。

例如:

  • 被控端是带鱼屏;
  • 控制端是普通笔记本屏幕;
  • 浏览器缩放比例不是 100%;
  • 远程画面被压缩后鼠标坐标不准确。

为了解决这个问题,系统加入了分辨率配置功能。

控制端可以设置:

  • 传输宽度;
  • 传输高度;
  • 缩放模式;
  • 是否保持比例;
  • 是否适合窗口显示。

并且分辨率修改不是立即生效,而是通过 “应用分辨率”按钮 手动确认后才会应用,避免误操作导致画面突然变化。


7. 全屏观看

为了提高远程操作体验,控制端网页增加了 全屏观看 按钮。

点击后,远程画面可以进入浏览器全屏模式,更适合长时间操作被控端电脑。

这个功能在以下场景比较有用:

  • 远程写代码;
  • 远程配置软件;
  • 远程操作后台系统;
  • 远程协助他人处理电脑问题。

8. 托盘运行

被控端程序现在支持托盘运行。

也就是说,点击窗口右上角关闭按钮时,程序不会直接退出,而是最小化到 Windows 右下角托盘。

托盘右键菜单支持:

  • 显示窗口;
  • 退出程序。

这样可以避免用户误关程序导致远程连接中断。


9. 无黑色控制台窗口

Windows 被控端打包后,已经改成 GUI 程序运行方式。

也就是说,双击 RemoteAgentSafe.exe 后,不会再弹出黑色命令行窗口,只显示图形界面。

这对于普通用户来说体验更好,也更接近正式桌面软件。


三、技术架构

1. 被控端 Agent

被控端主要负责:

  • 采集屏幕;
  • 压缩画面;
  • 上传画面帧;
  • 接收控制指令;
  • 执行鼠标和键盘操作;
  • 执行终端命令;
  • 管理窗口和托盘。

核心技术点包括:

  • Java Swing 图形界面;
  • Java Robot 屏幕采集与输入模拟;
  • HTTP/WebSocket 通信;
  • JPEG 图像压缩;
  • Windows 托盘 TrayIcon;
  • 持久化 Shell 进程。

2. 中转服务器

中转服务器主要负责连接控制端和被控端。

它的作用类似一个消息中转站:

被控端上传画面帧
控制端请求最新画面
控制端发送鼠标键盘指令
被控端拉取并执行控制指令

中转服务器的优势是部署灵活,可以放在 Linux 云服务器上运行。
只要被控端和控制端都能访问这台服务器,就可以建立远程控制链路。


3. 网页控制端

网页控制端运行在浏览器中,不需要安装额外软件。

主要功能包括:

  • 显示远程屏幕;
  • 发送鼠标事件;
  • 发送键盘事件;
  • 调整分辨率;
  • 全屏观看;
  • 打开网页终端;
  • 查看连接状态。

这种方式的好处是跨平台,只要有浏览器就能访问控制端页面。


四、系统界面

被控端界面主要分为几个区域:

  • 连接与授权;
  • 画面质量设置;
  • P2P 与控制;
  • 状态栏;
  • 启动、保存并重连、停止按钮。

控制端网页主要包括:

  • 远程画面显示区;
  • 全屏观看按钮;
  • 分辨率设置;
  • 鼠标键盘控制;
  • 网页终端;
  • 连接状态显示。

后续可以继续优化界面,让它更加接近专业远程控制软件。


五、使用方式

1. 启动中转服务器

在服务器上运行:

java -jar relay-server.jar

服务器启动后,会监听指定端口。

例如:

http://服务器IP:端口

控制端浏览器访问这个地址即可打开网页控制端。


2. 启动被控端

在 Windows 被控电脑上运行:

RemoteAgentSafe.exe

然后填写:

  • 中转服务器地址;
  • 被控端令牌;
  • 访问密码;
  • 画面质量;
  • 分辨率配置。

点击启动后,被控端就会连接服务器。


3. 控制端访问

在另一台电脑或者手机浏览器中打开服务器地址。

输入对应令牌和密码后,就可以进入远程控制页面。


六、性能优化思路

远程控制系统的流畅度主要受几个因素影响:

1. 屏幕采集速度

被控端需要不断截取屏幕画面,如果分辨率很高,比如 2752×1152 或 4K,采集和压缩压力会明显增加。

2. 图像压缩速度

JPEG 压缩质量越高,画面越清晰,但数据量也越大,传输和编码压力也越高。

3. 网络延迟

如果通过公网服务器中转,延迟会比局域网直连高。
如果控制端和被控端在同一局域网,优先使用直连会更流畅。

4. 浏览器刷新机制

网页端显示远程画面时,也要考虑浏览器刷新、图片解码、Canvas 绘制等问题。

5. 目标帧率设置

理论上可以设置 60 FPS,但实际能不能达到,还取决于:

  • 被控端 CPU 性能;
  • 屏幕分辨率;
  • JPEG 质量;
  • 网络带宽;
  • 中转服务器性能;
  • 控制端浏览器性能。

因此,比较推荐的配置是:

FPS:30
JPEG质量:60% - 75%
传输分辨率:1280×720 或 1600×900

如果追求清晰度,可以提高分辨率。
如果追求流畅度,可以降低分辨率和 JPEG 质量。


七、目前存在的问题

这个系统目前还是学习和实验性质,和成熟远程控制软件相比,还有不少可以优化的地方。

例如:

  • 画面传输还可以改成 WebRTC;
  • 终端可以进一步做成完整伪终端 PTY;
  • 文件传输功能可以继续完善;
  • P2P 穿透能力可以增强;
  • 远程声音传输还没有实现;
  • 权限控制和连接日志可以加强;
  • 控制端 UI 还可以继续美化;
  • 多用户同时观看和控制需要进一步设计。

这些都是后续可以继续迭代的方向。


八、后续计划

后面可以继续优化以下功能:

1. 改进画面传输

目前主要基于截图和 JPEG 传输。
后续可以考虑使用:

  • WebRTC;
  • H.264 编码;
  • 差分帧传输;
  • 局部区域更新。

这样可以显著提升帧率和流畅度。


2. 增强终端能力

目前网页终端已经支持持久 Shell 会话。
后续可以继续增强为更接近真实终端的模式,比如:

  • 支持方向键;
  • 支持 Tab 补全;
  • 支持 Ctrl+C;
  • 支持交互式程序;
  • 支持 ANSI 颜色输出;
  • 支持命令历史。

3. 文件传输

可以增加一个简单的文件管理模块,实现:

  • 上传文件到被控端;
  • 从被控端下载文件;
  • 浏览目录;
  • 删除文件;
  • 创建文件夹;
  • 生成临时下载链接。

这样系统就不仅能远程控制,还能完成远程文件管理。


4. 权限与安全

远程控制软件最重要的是安全。

后续可以继续完善:

  • 访问密码加密;
  • Token 自动生成;
  • 连接日志记录;
  • 控制端白名单;
  • 操作审计;
  • 临时授权码;
  • 连接确认弹窗;
  • 超时自动断开。

只有把授权和安全做好,远程控制系统才适合长期使用。


九、总结

SafeRemote 小助手是一个基于 Java 实现的轻量级远程控制系统。

它实现了远程屏幕查看、鼠标键盘控制、网页终端、分辨率调整、全屏观看、托盘运行、无黑窗启动等功能。

虽然它目前还不能完全替代专业远程桌面软件,但作为一个学习项目,它涵盖了很多实用技术点:

  • Java 桌面程序开发;
  • 屏幕采集;
  • 鼠标键盘模拟;
  • Web 控制端;
  • 服务端中转;
  • 远程终端;
  • Windows 程序打包;
  • 托盘程序设计;
  • 网络通信与性能优化。

通过这个项目,可以比较完整地理解一个远程控制系统从被控端、服务端到控制端的基本实现思路。

后续如果继续加入 WebRTC、文件传输、权限审计和更完善的 P2P 能力,这个系统还可以进一步发展成一个更完整的个人远程协助工具。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐