欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

react?express實現(xiàn)webssh?demo解析

 更新時間:2023年04月04日 12:37:39   作者:黃娟  
這篇文章主要為大家介紹了詳解react?express實現(xiàn)webssh?demo解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

 下面是一個簡單的 WebSSH Demo,實現(xiàn)了通過瀏覽器連接 SSH 服務器并進行交互的功能。

實現(xiàn) WebSSH 的基本思路

WebSSH 可以分成以下幾個模塊:

  • 前端界面:使用 xterm.js 實現(xiàn)一個基于瀏覽器的終端界面。
  • WebSocket 連接:使用 WebSocket 連接連接 WebSSH 服務器后端。
  • SSH 連接:使用 ssh2.js 庫連接 SSH 服務器,然后在 WebSocket 和 SSH 之間建立一個雙向通訊。

實現(xiàn) Demo 的代碼

服務器端代碼

服務器端代碼使用 Node.js 和 WebSocket 模塊實現(xiàn),主要用于連接到遠程 SSH 服務器并與前端建立 WebSocket 連接。

const SSHClient = require('ssh2').Client;
const utf8 = require('utf8');
export const createNewServer = (machineConfig: any, socket: any) => {
  const ssh = new SSHClient();
  const { host, username, password } = machineConfig;
  // 連接成功
  ssh.on('ready', function () {
    socket.send('\r\n*** SSH CONNECTION SUCCESS ***\r\n');
    ssh.shell(function (err: any, stream: any) {
      // 出錯
      if (err) {
        return socket.send('\r\n*** SSH SHELL ERROR: ' + err.message + ' ***\r\n');
      }
      // 前端發(fā)送消息
      socket.on('message', function (data: any) {
        stream.write(data);
      });
      // 通過sh發(fā)送消息給前端
      stream.on('data', function (d: any) {
        socket.send(utf8.decode(d.toString('binary')));
        // 關閉連接
      }).on('close', function () {
        ssh.end();
      });
    })
    // 關閉連接
  }).on('close', function () {
    socket.send('\r\n*** SSH CONNECTION CLOSED ***\r\n');
    // 連接錯誤
  }).on('error', function (err: any) {
    socket.send('\r\n*** SSH CONNECTION ERROR: ' + err.message + ' ***\r\n');
    // 連接
  }).connect({
    port: 22,
    host,
    username,
    password
  });
}

前端代碼

前端代碼主要包括一個包裝 xterm.js 的 React 組件和一些 WebSockets 相關的代碼。

import React, { useEffect, useRef } from 'react';
import { Terminal } from 'xterm';
import { WebLinksAddon } from 'xterm-addon-web-links';
import { FitAddon } from 'xterm-addon-fit';
import 'xterm/css/xterm.css';
const FontSize = 14;
const Col = 80;
const WebTerminal = () => {
  const webTerminal = useRef(null);
  const ws = useRef(null);
  useEffect(() => {
    // 初始化終端
    const ele = document.getElementById('terminal');
    if (ele && !webTerminal.current) {
      const height = ele.clientHeight;
      // 初始化
      const terminal = new Terminal({
        cursorBlink: true,
        cols: Col,
        rows: Math.ceil(height / FontSize),
      });
      // 輔助
      const fitAddon = new FitAddon();
      terminal.loadAddon(new WebLinksAddon());
      terminal.loadAddon(fitAddon);
      terminal.open(ele);
      terminal.write('Hello from \x1B[1;3;31mxterm.js\x1B[0m $ ');
      fitAddon.fit();
      webTerminal.current = terminal;
    }
    // 初始化ws連接
    if (ws.current) ws.current.close();
    const socket = new WebSocket('ws://localhost:3001');
    socket.onopen = () => {
      socket.send('connect success');
    };
    ws.current = socket;
  }, []);
  useEffect(() => {
    // 新增監(jiān)聽事件
    const terminal = webTerminal.current;
    const socket = ws.current;
    if (terminal && socket) {
      // 監(jiān)聽
      terminal.onKey(e => {
        const { key } = e;
        socket.send(key);
      });
      // ws監(jiān)聽
      socket.onmessage = e => {
        console.log(e);
        if (typeof e.data === 'string') {
          terminal.write(e.data);
        } else {
          console.error('格式錯誤');
        }
      };
    }
  }, []);
  return <div id="terminal"  style={{ backgroundColor: '#000', width: '100vw', height: '100vh' }}/>;
};
export default WebTerminal;

WebSSH 組件借助 Hooks 特性進行 WebSocket 和 xterm.js 的初始化。具體來說,這個組件使用了 useEffect Hook 在組件掛載時完成以下工作:

  • 初始化 Terminal 組件。
  • 初始化 WebSocket 連接。
  • 為 Terminal 組件綁定輸入事件和 WebSocket 發(fā)送數(shù)據(jù)的邏輯。

在 React 應用中使用 WebSSH 組件

你需要在你的 React的index.js 文件中引入 WebSSH 組件,并在你的應用中渲染它:

import WebSSH from './components/WebSSH';
import React from 'react';
import ReactDOM from 'react-dom';
ReactDOM.render(
  <WebSSH />,
  document.getElementById('root')
);

效果

編輯

總結(jié)

在本篇博客中,我們學習了如何使用 xterm.js、WebSocket 和 ssh2.js 庫構(gòu)建一個 WebSSH 應用程序。我們創(chuàng)建了一個簡單的 Demo 來演示該過程。

完整代碼參考

GitHub - judithhuang/webssh-demo

以上就是react express實現(xiàn)webssh demo解析的詳細內(nèi)容,更多關于react express實現(xiàn)webssh的資料請關注腳本之家其它相關文章!

相關文章

  • 每天一個hooks學習之useUnmount

    每天一個hooks學習之useUnmount

    這篇文章主要為大家介紹了每天一個hooks學習之useUnmount,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • React Native自定義組件與輸出方法詳解

    React Native自定義組件與輸出方法詳解

    這篇文章主要給大家介紹了關于React Native自定義組件與輸出方法的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-07-07
  • React全局狀態(tài)管理的三種底層機制探究

    React全局狀態(tài)管理的三種底層機制探究

    近兩年前端技術的發(fā)展如火如荼,大量的前端項目都在使用或轉(zhuǎn)向 Vue 和 React 的陣營,由前端渲染頁面的單頁應用占比也越來越高,這篇文章主要給大家介紹了關于React全局狀態(tài)管理的三種底層機制,需要的朋友可以參考下
    2021-09-09
  • react裝飾器與高階組件及簡單樣式修改的操作詳解

    react裝飾器與高階組件及簡單樣式修改的操作詳解

    這篇文章主要介紹了react裝飾器與高階組件及簡單樣式修改的操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-09-09
  • React中父子組件通信詳解

    React中父子組件通信詳解

    這篇文章主要介紹了React中父子組件通信詳解,在父組件中,為子組件添加屬性數(shù)據(jù),即可實現(xiàn)父組件向子組件通信,文章通過圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • React Context詳解使用過程

    React Context詳解使用過程

    在Reactor中提供了Context來替代ThreadLocal,可以實現(xiàn)一個跨線程的共享變量的透明方式。本文主要為大家介紹了Context的用法的用法,感興趣的可以了解一下
    2023-03-03
  • React組件設計過程之仿抖音訂單組件

    React組件設計過程之仿抖音訂單組件

    這篇文章主要介紹了React組件設計過程之仿抖音訂單組件的實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 如何解決React官方腳手架不支持Less的問題(小結(jié))

    如何解決React官方腳手架不支持Less的問題(小結(jié))

    這篇文章主要介紹了如何解決React官方腳手架不支持Less的問題(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • React中使用Echarts無法顯示title、tooltip等組件的解決方案

    React中使用Echarts無法顯示title、tooltip等組件的解決方案

    這篇文章主要介紹了React中使用Echarts無法顯示title、tooltip等組件的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • React經(jīng)典面試題之倒計時組件詳解

    React經(jīng)典面試題之倒計時組件詳解

    這些天也都在面試,面試的內(nèi)容也大多千篇一律,無外乎vue、react這些框架的一些原理,和使用方法,但是也遇到些有趣的題目,這篇文章主要給大家介紹了關于React經(jīng)典面試題之倒計時組件的相關資料,需要的朋友可以參考下
    2022-03-03

最新評論