中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

react?express怎么實現webssh?demo解析

發布時間:2023-04-04 14:22:37 來源:億速云 閱讀:145 作者:iii 欄目:開發技術

本篇內容介紹了“react express怎么實現webssh demo解析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

實現 WebSSH 的基本思路

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

  • 前端界面:使用 xterm.js 實現一個基于瀏覽器的終端界面。

  • WebSocket 連接:使用 WebSocket 連接連接 WebSSH 服務器后端。

  • SSH 連接:使用 ssh3.js 庫連接 SSH 服務器,然后在 WebSocket 和 SSH 之間建立一個雙向通訊。

實現 Demo 的代碼

服務器端代碼

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

const SSHClient = require('ssh3').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');
      }
      // 前端發送消息
      socket.on('message', function (data: any) {
        stream.write(data);
      });
      // 通過sh發送消息給前端
      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(() => {
    // 新增監聽事件
    const terminal = webTerminal.current;
    const socket = ws.current;
    if (terminal && socket) {
      // 監聽
      terminal.onKey(e => {
        const { key } = e;
        socket.send(key);
      });
      // ws監聽
      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 發送數據的邏輯。

在 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')
);

效果

react?express怎么實現webssh?demo解析

“react express怎么實現webssh demo解析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

金乡县| 遂宁市| 舒城县| 星子县| 东山县| 东乡县| 二手房| 大英县| 吉木乃县| 龙胜| 尤溪县| 江安县| 三原县| 高邮市| 延津县| 阜城县| 临汾市| 望江县| 宁德市| 南城县| 沙洋县| 余干县| 通榆县| 通许县| 长兴县| 乌拉特中旗| 石门县| 如皋市| 四子王旗| 行唐县| 平泉县| 普兰县| 当阳市| 阿鲁科尔沁旗| 永春县| 治多县| 偃师市| 岑巩县| 榆社县| 邵东县| 随州市|