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

no-vnc和node.js實現(xiàn)web遠(yuǎn)程桌面的完整步驟

 更新時間:2019年08月11日 16:33:16   作者:張喜碩  
這篇文章主要給大家介紹了關(guān)于no-vnc和node.js實現(xiàn)web遠(yuǎn)程桌面的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

引言

項目需求,要求在瀏覽器端進(jìn)行遠(yuǎn)程桌面的訪問,如圖所示:

實現(xiàn)遠(yuǎn)程桌面,需要依賴VNC協(xié)議:

VNC(Virtual Network Computing),為一種使用RFB協(xié)議的屏幕畫面分享及遠(yuǎn)程操作軟件。此軟件借由網(wǎng)絡(luò),可發(fā)送鍵盤與鼠標(biāo)的動作及即時的屏幕畫面。

相關(guān)的參考比較少,去谷歌搜索出來的文章大多都是如何使用客戶端進(jìn)行VNC的搭建與訪問,很少有將其內(nèi)嵌到web里的,騰訊云有相關(guān)的功能,但因為業(yè)務(wù)安全性,咱也看不著人家咋實現(xiàn)的。

再見,百度。用百度查了一次之后,我才知道原來VNC是口紅。

所以VNC實踐之路就是如下流程:

  1. 根據(jù)自己已有的知識與技能,設(shè)計一個VNC方案。
  2. 嘗試,分析可行性。
  3. 根據(jù)可行性修改方案細(xì)節(jié),或推翻方案重新設(shè)計。

從整體的最開始設(shè)計,到最終落地方案,大約經(jīng)歷了以下七個方案的迭代:

  1. SpringBoot調(diào)用REALVNC的C++類庫,前后臺進(jìn)行數(shù)據(jù)交互。失敗,因為REALVNC太貴了,客戶承受不起。
  2. SpringBoot中模仿TightVNC實現(xiàn)JavaViewer獲取數(shù)據(jù),前后臺進(jìn)行數(shù)據(jù)交互。失敗,因為TightVNC JavaViewer的源碼沒注釋,看不懂。
  3. SpringBoot中手寫VNC客戶端,前后臺數(shù)據(jù)交互。失敗,因為從0實現(xiàn)一個協(xié)議太復(fù)雜了,時間成本太高。
  4. 瀏覽器端只做VNC鏈接,使用原生客戶端,直接訪問主機。失敗,需要安裝軟件,且只能訪問局域網(wǎng)中的主機。
  5. 原生客戶端 + nginx數(shù)據(jù)轉(zhuǎn)發(fā)。失敗,需要安裝軟件,無法實現(xiàn)動態(tài)轉(zhuǎn)發(fā)(無法動態(tài)變更nginx配置文件)。
  6. no-vnc + nginx數(shù)據(jù)轉(zhuǎn)發(fā)。失敗,無法實現(xiàn)動態(tài)轉(zhuǎn)發(fā)(無法動態(tài)變更nginx配置文件)。
  7. no-vnc + node.js數(shù)據(jù)轉(zhuǎn)發(fā)。成功,完美實現(xiàn)。

實現(xiàn)

思想

整體思想如下圖所示:nginx轉(zhuǎn)發(fā)前臺的websocket連接,為了實現(xiàn)外網(wǎng)轉(zhuǎn)發(fā),添加開發(fā)的node.js服務(wù)器作為代理,將瀏覽器端no-vnc的websocket數(shù)據(jù)報在運輸層轉(zhuǎn)發(fā)給目標(biāo)主機。

why nginx ?

如果思考過的話,其實發(fā)現(xiàn)不用nginx也能實現(xiàn)功能,這里使用nginx主要是減少了前臺對后臺架構(gòu)的耦合。

添加網(wǎng)關(guān)轉(zhuǎn)發(fā)所有請求,對前臺只暴露一個端口,不管后臺用什么技術(shù),用什么架構(gòu),用什么微服務(wù),在前臺看來,就好像在訪問單體應(yīng)用一樣。

就像目前的華軟項目一樣,后臺用了spring-boot、.net、node.js,各語言各框架發(fā)揮各自的優(yōu)勢,通過nginx的轉(zhuǎn)發(fā)將各模塊連接起來,無論后臺的架構(gòu)怎么變,對前臺毫無影響,這應(yīng)該是微服務(wù)架構(gòu)的最佳實踐。

這是spring官方推薦的微服務(wù)架構(gòu)圖,我們學(xué)習(xí)并實踐了api網(wǎng)關(guān),spring推薦netflix zuul,我們用的nginx,在請求轉(zhuǎn)發(fā)上,二者性能不相上下。

隨著業(yè)務(wù)需求的增長,我們肯定也會服務(wù)拆分,服務(wù)注冊,服務(wù)發(fā)現(xiàn),消息隊列,RPC調(diào)用。然后用上eureka、zookeeper、hystrix、feign等一個個優(yōu)秀的開源組件,一起探索spring-cloud的最佳實踐。

websocket

之前一直不了解websocket,就是知道個名,具體細(xì)節(jié)沒有學(xué)習(xí)。

http協(xié)議:請求響應(yīng),客戶端請求,服務(wù)器響應(yīng),一次請求就結(jié)束。服務(wù)端無法主動向客戶端推送數(shù)據(jù)。

為了解決這個問題,websocket應(yīng)運而生。如果所示,不做贅述。

no-vnc

官網(wǎng)鏈接:noVNC

安裝依賴:

npm install @novnc/novnc

前臺組件

一個空div,同時在組件中引用。

<div class="container" #container>
</div>
@ViewChild('container')
private container: ElementRef<HTMLDivElement>;

核心的代碼其實就這幾行,所有協(xié)議的細(xì)節(jié)都被封裝在no-vnc中的RFB類中了。

所有描述以訪問192.168.0.104主機的5900端口為例,websocket地址為:ws://127.0.0.1:8013/vnc/192.168.0.104:5900。

/**
 * VNC連接
 */
private VNCConnect(): void {
  /** 訪問 /vnc/ websocket */
  const url = `ws://${this.host}/vnc/${this.ip}:${this.port}`;

  /** 新建遠(yuǎn)程控制對象 */
  this.rfb = new RFB(this.container.nativeElement, url, {
    credentials: {
      password: this.password,
    },
  });

  /** 添加connect事件監(jiān)聽器 */
  this.rfb.addEventListener('connect', () => {
    this.rfb.focus();
  });
}

nginx 轉(zhuǎn)發(fā)

nginx監(jiān)聽本地的8013端口。

ws://127.0.0.1:8013/vnc/192.168.0.104:5900請求發(fā)給了nginx,根據(jù)前綴匹配,以/vnc/開頭的轉(zhuǎn)發(fā)給8112端口。

location /vnc/ {
  proxy_pass http://127.0.0.1:8112/;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection $connection_upgrade;
}

node.js 轉(zhuǎn)發(fā)

node.js監(jiān)聽8112端口,處理當(dāng)前的websocket請求。

/** 建立基于 vnc_port 的 websocket 服務(wù)器 */
const vnc_server = http.createServer();
vnc_server.listen(vnc_port, function () {
  const web_socket_server = new WebSocketServer({server: vnc_server});
  web_socket_server.on('connection', web_socket_handler);
});

轉(zhuǎn)發(fā)的核心代碼在方法web_socket_handler中,以下是完整代碼:

這里說一句,之前寫的注釋都不規(guī)范,所有注釋都應(yīng)該是文檔注釋,單行注釋使用/** 內(nèi)容 */的格式。

/** 引入 http 包 */
const http = require('http');

/** 引入 net 包 */
const net = require('net');

/** 引入 websocket 類 */
const WebSocketServer = require('ws').Server;

/** 本機 ip 地址 */
const localhost = '127.0.0.1';

/** 開放的 vnc websocket 轉(zhuǎn)發(fā)端口 */
const vnc_port = '8112';

/** 打印提示信息 */
console.log(`成功創(chuàng)建 WebSocket 代理 : ${localhost} : ${vnc_port}`);

/** 建立基于 vnc_port 的 websocket 服務(wù)器 */
const vnc_server = http.createServer();
vnc_server.listen(vnc_port, function () {
  const web_socket_server = new WebSocketServer({server: vnc_server});
  web_socket_server.on('connection', web_socket_handler);
});

/** websocket 處理器 */
const web_socket_handler = function (client, req) {
  /** 獲取請求url */
  const url = req.url;

  /** 截取主機地址 */
  const host = url.substring(url.indexOf('/') + 1, url.indexOf(':'));

  /** 截取端口號 */
  const port = Number(url.substring(url.indexOf(':') + 1));

  /** 打印日志 */
  console.log(`WebSocket 連接 : 版本 ${client.protocolVersion}, 協(xié)議 ${client.protocol}`);

  /** 連接到 VNC Server */
  const target = net.createConnection(port, host, function () {
    console.log('連接至目標(biāo)主機');
  });

  /** 數(shù)據(jù)事件 */
  target.on('data', function (data) {
    try {
      client.send(data);
    } catch (error) {
      console.log('客戶端已關(guān)閉,清理到目標(biāo)主機的連接');
      target.end();
    }
  });

  /** 結(jié)束事件 */
  target.on('end', function () {
    console.log('目標(biāo)主機已關(guān)閉');
    client.close();
  });

  /** 錯誤事件 */
  target.on('error', function () {
    console.log('目標(biāo)主機連接錯誤');
    target.end();
    client.close();
  });

  /** 消息事件 */
  client.on('message', function (msg) {
    target.write(msg);
  });

  /** 關(guān)閉事件 */
  client.on('close', function (code, reason) {
    console.log(`WebSocket 客戶端斷開連接:$[code] [${reason}]`);
    target.end();
  });

  /** 錯誤事件 */
  client.on('error', function (error) {
    console.log(`WebSocket 客戶端出錯:${error}`);
    target.end();
  });
};

總結(jié)

為了這個功能犯愁了半個月,覺也睡不好,客戶都在騰訊云上看到過的功能,寫不出來就特別的難受,如今終于圓滿解決。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Nest.js參數(shù)校驗和自定義返回數(shù)據(jù)格式詳解

    Nest.js參數(shù)校驗和自定義返回數(shù)據(jù)格式詳解

    這篇文章主要給大家介紹了關(guān)于Nest.js參數(shù)校驗和自定義返回數(shù)據(jù)格式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 深入理解Node.js中CORS的三個重要響應(yīng)頭

    深入理解Node.js中CORS的三個重要響應(yīng)頭

    CORS是一種安全機制,通過配置適當(dāng)?shù)捻憫?yīng)頭,服務(wù)器可以允許或限制外部域?qū)Y源的訪問,本文主要介紹了Node.js中CORS的三個重要響應(yīng)頭,感興趣的可以了解一下
    2024-12-12
  • windows安裝nvm并配置換源的實現(xiàn)步驟

    windows安裝nvm并配置換源的實現(xiàn)步驟

    本文介紹在Windows上安裝NVM并配置Node.js路徑和鏡像源,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • 詳解Node.js項目APM監(jiān)控之New Relic

    詳解Node.js項目APM監(jiān)控之New Relic

    本篇文章主要介紹了Node.js項目APM監(jiān)控之New Relic,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 利用Chrome DevTools直接調(diào)試Node.js和JavaScript的方法詳解(并行)

    利用Chrome DevTools直接調(diào)試Node.js和JavaScript的方法詳解(并行)

    現(xiàn)在我們可以用瀏覽器調(diào)試node.js了!!!下面這篇文章主要介紹了利用Chrome DevTools直接調(diào)試Node.js和JavaScript的方法步驟,文中介紹的很詳細(xì),需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。
    2017-02-02
  • Node.js服務(wù)器開啟Gzip壓縮教程

    Node.js服務(wù)器開啟Gzip壓縮教程

    開啟網(wǎng)站的 gzip 壓縮功能,通??梢愿哌_(dá)70%,也就是說,如果你的網(wǎng)頁有30K,壓縮之后就變成9K, 對于大部分網(wǎng)站,顯然可以明顯提高瀏覽速度(注:需要瀏覽器支持)。
    2017-08-08
  • Node.js安裝教程和NPM包管理器使用詳解

    Node.js安裝教程和NPM包管理器使用詳解

    這篇文章主要介紹了Node.js安裝教程和NPM包管理器使用詳解,安裝部分講解了Windows、和MAC OS下的安裝圖解,并介紹了Linux下的源碼安裝方法,最后對NPM包管理器做了詳細(xì)介紹,需要的朋友可以參考下
    2014-08-08
  • node.js實現(xiàn)身份認(rèn)證的示例代碼

    node.js實現(xiàn)身份認(rèn)證的示例代碼

    本文主要介紹了 node.js實現(xiàn)身份認(rèn)證的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Vue+Node實現(xiàn)的商城用戶管理功能示例

    Vue+Node實現(xiàn)的商城用戶管理功能示例

    這篇文章主要介紹了Vue+Node實現(xiàn)的商城用戶管理功能,結(jié)合實例形式詳細(xì)分析了商城用戶管理的前臺登錄、校驗、跳轉(zhuǎn)、退出等相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • 使用Node.js創(chuàng)建HTTP服務(wù)器并實現(xiàn)公網(wǎng)訪問本地Server的步驟

    使用Node.js創(chuàng)建HTTP服務(wù)器并實現(xiàn)公網(wǎng)訪問本地Server的步驟

    Node.js含有一系列內(nèi)置模塊,使得程序可以脫離 Apache HTTP Server 或 IIS,作為獨立服務(wù)器運,下面將介紹如何簡單幾步實現(xiàn)遠(yuǎn)程公共網(wǎng)絡(luò)下訪問windwos node.js的服務(wù)端,感興趣的朋友一起看看吧
    2023-11-11

最新評論

濮阳县| 西乌珠穆沁旗| 台州市| 肇庆市| 株洲市| 宾阳县| 盐津县| 涪陵区| 枣庄市| 汉沽区| 玛纳斯县| 乌兰县| 长沙县| 贵溪市| 原平市| 梓潼县| 托克托县| 温泉县| 淅川县| 庆城县| 类乌齐县| 南宁市| 泰和县| 合江县| 偃师市| 临澧县| 理塘县| 保定市| 温州市| 社会| 扎赉特旗| 新巴尔虎右旗| 西安市| 化德县| 瑞丽市| 南木林县| 云梦县| 阿巴嘎旗| 拜城县| 通山县| 鄂伦春自治旗|