最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot+Guacamole實現(xiàn)遠程桌面教程

 更新時間:2025年10月13日 09:36:38   作者:肥仔哥哥1930  
文章討論了坐席遠程幫辦的技術(shù)解決方案,比較了VNC和RDP兩種協(xié)議的優(yōu)缺點,最終選擇了基于RDP的Guacamole框架,文中詳細介紹了Guacamole的部署方法和如何通過Springboot集成,同時也提供了一些關(guān)于遠程桌面技術(shù)的基礎(chǔ)知識和實際應(yīng)用的建議

前言

最近不是在想方案,就是在方案的預(yù)研上,頭發(fā)越來越少啊。

今天要跟大家分享的是坐席遠程幫辦,名字定義很高大,技術(shù)落地實際上就是遠程桌面+語音指導(dǎo)。

技術(shù)選型

我們團隊很健全,各語種的研發(fā)都有,但是就是兄弟們現(xiàn)在都項目纏身。

我作為技術(shù)負責(zé)人,肯定是要自己先有方向,至少要能夠在各種需求場景拋磚引玉吧。所以在遠程桌面這塊先行預(yù)研,先給C語種方向的兄弟整個可行性高點的方案:

1、https://github.com/xunki/RemoteDesktopManage

2、java方向我自己來

遠程桌面協(xié)議分析

其實在選型時也是各方考量,首先是要不能用人民幣,用人民幣要考慮投入與回報是否對等。然后就是要考量我們現(xiàn)在的人力儲備、技術(shù)底蘊等等。

在這過程中,首先是考量資源、帶寬,然后就是針對VNC與RDP協(xié)議的抉擇了。

按說VNC協(xié)議舊,那肯定就是資源多、可參考的資料就相對多,但是對比優(yōu)缺點,實在是不想到時候因為效果、延時等影響形象,免得到時候吃虧了還不討好(按說不應(yīng)該太計較個人得失,可是現(xiàn)實很殘酷啊)。

廢話不說了,先看對比協(xié)議:

原理與協(xié)議

特性VNC(Virtual Network Computing)RDP(Remote Desktop Protocol)
協(xié)議類型基于 RFB(Remote Frame Buffer)協(xié)議,傳輸?shù)氖瞧聊幌袼匦畔?/td>微軟專有協(xié)議,傳輸 圖形對象、指令、音視頻、剪貼板 等
工作方式服務(wù)器端抓取屏幕像素并發(fā)送給客戶端客戶端發(fā)送操作命令,服務(wù)器端渲染界面并發(fā)送指令給客戶端,客戶端再繪制界面
平臺支持跨平臺,Windows / Linux / macOS / 嵌入式主要是 Windows,但有 Linux/macOS 客戶端支持

性能與體驗

特性VNCRDP
帶寬占用較高,因為傳輸?shù)氖窍袼?/td>較低,因為只傳輸界面指令而非像素
響應(yīng)速度較慢,高分辨率時延遲明顯快,延遲低,尤其在低帶寬下表現(xiàn)更好
圖像質(zhì)量像素傳輸,容易有模糊或延遲高質(zhì)量,支持壓縮和多種圖形加速
音頻/多媒體一般不傳輸音頻,需要額外設(shè)置原生支持音頻重定向、多媒體優(yōu)化

功能與安全

特性VNCRDP
文件傳輸一般需要額外工具原生支持文件共享
剪貼板共享支持,但實現(xiàn)依賴客戶端原生支持
多會話通常一個顯示器對應(yīng)一個會話(Linux 可以多個會話)Windows 支持多用戶多會話
安全性默認明文傳輸,需要加密(SSH/VPN)支持 TLS 加密、網(wǎng)絡(luò)級認證(NLA)

使用場景

場景適合VNC適合RDP
跨平臺遠程訪問非 Windows 客戶端有限
高性能遠程辦公
服務(wù)器管理Linux 常用Windows Server
低帶寬環(huán)境RDP 優(yōu)化帶寬

小結(jié)

VNC

  • 優(yōu)點:跨平臺、輕量、簡單
  • 缺點:性能低、延遲大、默認不安全
  • 適合遠程監(jiān)控、嵌入式系統(tǒng)、跨平臺訪問

RDP

  • 優(yōu)點:低延遲、高性能、功能豐富(音頻、剪貼板、文件)
  • 缺點:跨平臺受限,Windows 外的體驗不如原生
  • 適合 Windows 遠程辦公、遠程服務(wù)器管理

架構(gòu)選型

經(jīng)過多方了解,既然VNC放棄,那java基于VNC的UltraVNC就不看了。

RDP了解到的就是Guacamole,而且活力還很大哦,最近才升級。

https://guacamole.apache.org/releases/1.6.0/

具體部署細節(jié),看官網(wǎng)就行,建議用docker,部署guacamole-server/guacamole-client。

如果不用docker,用tomcat部署client,那就有點折騰,其實,也就是tomcat放war包的地方要放擴展包,也就是處理授權(quán)的,官網(wǎng)提供了對應(yīng)jar,放在extensions目錄下。

要理解的是

  • guacamole-server(guacd)提供服務(wù)
  • guacamole-client(RestAPI客戶端)對外暴露接口

整體邏輯

瀏覽器 (HTML5/JS)

 │ WebSocket

 ▼

Java Web 應(yīng)用 ── REST API ──? Guacamole (guacd)

                            │

                            ▼

                       Windows RDP Server

我們java能做的就是在Java Web應(yīng)用層做認證、連接管理等等。

再來看看springboot的集成吧。

就是一個普通的Springboot服務(wù),關(guān)于Guacamole不需要額外的依賴,要說用到的,那就是Hutool的HttpUtil請求工具類。其實還有一種集成方案,那個就需要相關(guān)依賴,但是那個要自己造的輪子也多,不適合快速落地。

RdpController

/**
 * RDP管理
 *
 * @author zwmac
 */
@Slf4j
@RestController
@RequestMapping("/rdp")
public class RdpController {

    @Resource
    private GuacamoleRestService guacamoleRestService;

    /**
     * guacamole登錄
     *
     * @param rdpInfoVo 登錄信息
     * @return 登錄結(jié)果
     */
    @GetMapping("/login")
    public RestResponse<?> login(@RequestBody RdpInfoVo rdpInfoVo) {
        return guacamoleRestService.login(rdpInfoVo.getUsername(), rdpInfoVo.getPassword());
    }

    /**
     * 列出所有連接
     *
     * @param token 登錄token
     * @return 連接列表
     */
    @GetMapping("/listConnections")
    public RestResponse<?> listConnections(@RequestParam String token) {
        return guacamoleRestService.listConnections(token);
    }

    /**
     * 添加連接
     *
     * @param rdpConnectionInfoVo 連接信息
     * @return 添加結(jié)果
     */
    @PostMapping("/addConnection")
    public RestResponse<?> addConnection(@RequestBody RdpConnectionInfoVo rdpConnectionInfoVo) {
        return guacamoleRestService.addConnection(rdpConnectionInfoVo);
    }


}

GuacamoleRestService

/**
 * @author zwmac
 */
public interface GuacamoleRestService {
    /**
     * guacamole登錄
     *
     * @param username 用戶名
     * @param password 密碼
     * @return 登錄結(jié)果
     */
    RestResponse<?> login(String username, String password);

    /**
     * 列出所有連接
     *
     * @param token
     * @return
     */
    RestResponse<?> listConnections(String token);

    /**
     * 添加連接
     *
     * @param rdpConnectionInfoVo 連接信息
     * @return 添加結(jié)果
     */
    RestResponse<?> addConnection(RdpConnectionInfoVo rdpConnectionInfoVo);
}

GuacamoleRestServiceImpl

/**
 * @author zwmac
 */
@Service
public class GuacamoleRestServiceImpl implements GuacamoleRestService {

    @Value("${guacamole.base-url}")
    private String guacamoleBaseUrl;

    @Value("${guacamole.datasource}")
    private String datasource;
    @Value("${guacamole.admin-user}")
    private String adminUserName;

    @Value("${guacamole.admin-password}")
    private String adminPassword;

    @Autowired
    private RestTemplate restTemplate;


    @Override
    public RestResponse<?> login(String username, String password) {
        if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) {
            username = adminUserName;
            password = adminPassword;
        }
        Assert.isTrue(!StringUtils.isAnyBlank(username, password), "用戶名或密碼不能為空");

        Map<String, Object> formMap = new HashMap<>();
        formMap.put("username", username);
        formMap.put("password", password);
        HttpRequest post = HttpUtil.createPost(guacamoleBaseUrl + "/tokens");
        post.form(formMap);
        post.header("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
        HttpResponse execute = post.execute();
        if (execute.isOk()) {
            String executeBody = execute.body();
            return RestResponse.success(executeBody);
        }

        return RestResponse.fail("登錄失?。? + execute.body());
    }

    @Override
    public RestResponse<?> listConnections(String token) {
        Assert.hasText(token, "token不能為空");
        String getUrl = guacamoleBaseUrl + "/session/data/" + datasource + "/connections?token=" + token;
        HttpRequest get = HttpUtil.createGet(getUrl);
        HttpResponse execute = get.execute();
        if (execute.isOk()) {
            String executeBody = execute.body();
            return RestResponse.success(executeBody);
        }
        return RestResponse.fail("獲取連接列表失敗:" + execute.body());
    }

    @Override
    public RestResponse<?> addConnection(RdpConnectionInfoVo rdpConnectionInfoVo) {
        //參數(shù)校驗
        Assert.notNull(rdpConnectionInfoVo, "參數(shù)不能為空");

        return null;
    }
}

配置項

guacamole:
  base-url: http://你的guacamole部署ip:端口/guacamole/api
  datasource: mysql   # 對應(yīng) guacamole.properties 里的配置
  admin-user: guacadmin
  admin-password: guacadmin

最后,看看效果:

Apifox接口:

guacamole服務(wù)端管理界面:

遠程效果:

總結(jié)

好了,就寫到這里,希望能幫到大家。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

其實還是那句話,關(guān)鍵的關(guān)鍵是要有思路,思路很重要!?。?/p>

相關(guān)文章

  • JDK自帶監(jiān)控工具jstat、jmap、jstack的使用指南(附命令示例)

    JDK自帶監(jiān)控工具jstat、jmap、jstack的使用指南(附命令示例)

    jstat是JDK中提供的一個命令行工具,主要用來打印JVM?性能數(shù)據(jù)相關(guān)的統(tǒng)計數(shù)據(jù),這篇文章主要介紹了JDK自帶監(jiān)控工具jstat、jmap、jstack的使用指南,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-01-01
  • IntelliJ IDEA 2021.1 首個 Beta 版本發(fā)布

    IntelliJ IDEA 2021.1 首個 Beta 版本發(fā)布

    這篇文章主要介紹了IntelliJ IDEA 2021.1 首個 Beta 版本發(fā)布,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • SpringMVC+Spring+Mybatis實現(xiàn)支付寶支付功能的示例代碼

    SpringMVC+Spring+Mybatis實現(xiàn)支付寶支付功能的示例代碼

    這篇文章主要介紹了SpringMVC+Spring+Mybatis實現(xiàn)支付寶支付功能的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Java中的Random和ThreadLocalRandom詳細解析

    Java中的Random和ThreadLocalRandom詳細解析

    這篇文章主要介紹了Java中的Random和ThreadLocalRandom詳細解析,Random 類用于生成偽隨機數(shù)的流, 該類使用48位種子,其使用線性同余公式進行修改,需要的朋友可以參考下
    2024-01-01
  • Java處理日期時間的方法匯總

    Java處理日期時間的方法匯總

    這篇文章主要給大家介紹了利用Java中的Calendar 類處理日期時間的方法匯總,其中包括取日期的每部分、取當(dāng)月的第一天或最后一天、求兩個日期之間相隔的天數(shù)以及一年前的日期等等的示例代碼,有需要的朋友們可以直接參考借鑒,下面來一起看看吧。
    2016-12-12
  • springboot的controller中如何獲取applicatim.yml的配置值

    springboot的controller中如何獲取applicatim.yml的配置值

    本文介紹了在SpringBoot的Controller中獲取application.yml配置值的四種方式,并舉例說明了每種方式的使用場景和優(yōu)缺點,結(jié)合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • 使用maven創(chuàng)建普通項目命令行程序詳解

    使用maven創(chuàng)建普通項目命令行程序詳解

    大部分使用maven創(chuàng)建的是web項目,這里使用maven創(chuàng)建一個命令行程序,目的是讓大家了解maven特點和使用方式,有需要的朋友可以借鑒參考下
    2021-10-10
  • Windows中使用Java生成Excel文件并插入圖片的方法

    Windows中使用Java生成Excel文件并插入圖片的方法

    這篇文章主要介紹了Windows中使用Java生成Excel文件并插入圖片的方法,其中向Excel中插入圖片文中通過使用Apache POI來實現(xiàn),需要的朋友可以參考下
    2016-02-02
  • Java調(diào)用JavaScript實現(xiàn)字符串計算器代碼示例

    Java調(diào)用JavaScript實現(xiàn)字符串計算器代碼示例

    這篇文章主要介紹了Java調(diào)用JavaScript實現(xiàn)字符串計算器代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-12-12
  • Maven倉庫的具體使用(本地倉庫+遠程倉庫)

    Maven倉庫的具體使用(本地倉庫+遠程倉庫)

    Maven 在某個統(tǒng)一的位置存儲所有項目的構(gòu)件,這個統(tǒng)一的位置,我們就稱之為倉庫,本文主要介紹了Maven倉庫的具體使用(本地倉庫+遠程倉庫),感興趣的可以了解一下
    2023-11-11

最新評論

阿拉善右旗| 应城市| 漳平市| 新民市| 长岭县| 南城县| 汉川市| 灌云县| 景东| 红安县| 开化县| 勃利县| 乌兰察布市| 夏邑县| 淅川县| 赤水市| 双江| 扎鲁特旗| 阳山县| 绥中县| 南开区| 拉孜县| 屯昌县| 二连浩特市| 隆子县| 东乡县| 湟中县| 漳州市| 元谋县| 鄢陵县| 文化| 长沙市| 吴堡县| 九江市| 保山市| 兴安县| 塔城市| 红安县| 龙州县| 合水县| 铜山县|