如何将SpringBoot与Guacamole完美整合实现远程桌面?

摘要:前言 本文主要介绍的是SpringBoot如何整合Guacamole在浏览器是远程桌面的访问。 Guacamole 介绍 Apache Guacamole 是一个无客户端远程桌面网关。它支持标准协议,如 VNC、RDP 和 SSH。我们称之
前言 本文主要介绍的是SpringBoot如何整合Guacamole在浏览器是远程桌面的访问。 Guacamole 介绍 Apache Guacamole 是一个无客户端远程桌面网关。它支持标准协议,如 VNC、RDP 和 SSH。我们称之为无客户端,因为不需要插件或客户端软件。 用户使用他们的网络浏览器连接到 Guacamole 服务器。用 JavaScript 编写的 Guacamole 客户端由 Guacamole 服务器内的网络服务器提供给用户。加载后,此客户端使用 Guacamole 协议通过 HTTP 连接回服务器。部署到 Guacamole 服务器的 Web 应用程序读取 Guacamole 协议并将其转发到 guacd,即原生的 Guacamole 代理。这个代理实际上解释了 Guacamole 协议的内容,代表用户连接到任意数量的远程桌面服务器。Guacamole 协议与 guacd 结合提供了协议不可知性:Guacamole 客户端和 Web 应用程序都不需要知道实际使用的是什么远程桌面协议。 架构图如下: 协议 Web 应用程序根本不了解任何远程桌面协议。它不包含对 VNC 或 RDP 或由 Guacamole堆栈支持的任何其他协议的支持。它其实只懂Guacamole协议,这是一个用于远程显示渲染和事件传输的协议。虽然具有这些属性的协议自然具有与远程桌面协议相同的能力,但远程桌面协议和 Guacamole 协议背后的设计原则是不同的:Guacamole 协议并非旨在实现特定桌面环境的功能。 作为远程显示和交互协议,Guacamole 实现了现有远程桌面协议的超集。因此,向 Guacamole 添加对特定远程桌面协议(如RDP)的支持涉及编写一个中间层,在远程桌面协议和 Guacamole 协议之间进行“转换”。实现这样的转换与实现任何本地客户端没有什么不同,只是这个特定的实现呈现到远程显示器而不是本地显示器。 处理这种翻译的中间层是 guacd。 guacd guacd 是 Guacamole 的核心,它动态加载对远程桌面协议(称为“客户端插件”)的支持,并根据从 Web 应用程序收到的指令将它们连接到远程桌面。 guacd 是一个守护进程,它与 Guacamole 一起安装并在后台运行,监听来自 Web 应用程序的 TCP 连接。guacd 也不理解任何特定的远程桌面协议,而是实现了足够的 Guacamole 协议来确定需要加载哪些协议支持以及必须将哪些参数传递给它。加载客户端插件后,它会独立于 guacd 运行,并完全控制自身与 Web 应用程序之间的通信,直到客户端插件终止。 guacd 和所有客户端插件都依赖于一个公共库 libguac,这使得通过 Guacamole 协议进行的通信更容易也更抽象一些。 网络应用程序 用户实际与之交互的 Guacamole 部分是 Web 应用程序。 如前所述,Web 应用程序没有实现任何远程桌面协议。它依赖于 guacd,并且仅实现了一个漂亮的 Web 界面和身份验证层。 我们选择用 Java 实现 Web 应用程序的服务器端,但没有理由不能用不同的语言编写。事实上,因为 Guacamole 旨在成为一个 API,我们鼓励这样做。 RealMint Guacamole 现在是一个通用的远程桌面网关,但情况并非总是如此。Guacamole最初是用 JavaScript 编写的纯文本 Telnet 客户端,称为 RealMint(“RealMint”是“终端”的字谜)。它主要是为了演示而编写的,虽然目的是有用,但它的主要名声只是因为它是纯 JavaScript。 RealMint 使用的隧道是用 PHP 编写的。与 Guacamole 的 HTTP 隧道相比,RealMint 的隧道仅使用简单的长轮询,效率低下。RealMint 有一个不错的键盘实现,现在在 Guacamole 的键盘代码的一部分中存在,但这实际上是 RealMint 的功能和可用性的范围。 鉴于它只是一个遗留协议的实现,并且存在其他几个 JavaScript 终端模拟器,其中大多数已经建立和稳定,该项目被放弃了。 VNC客户端 一旦开发人员了解了 HTML5 canvas 标签,并看到它已经在 Firefox 和 Chrome 中实现,就开始在概念验证JavaScript VNC 客户端上开展工作。 这个客户端是带有 Java 服务器组件的纯 JavaScript,通过将 VNC 转换为相同的基于 XML 的版本来工作。它的发展自然是由VNC 的特性驱动的,它的范围仅限于将单个连接转发给一组用户。
阅读全文