您好,登錄后才能下訂單哦!
本篇內容介紹了“react express怎么實現webssh demo解析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
WebSSH 可以分成以下幾個模塊:
前端界面:使用 xterm.js 實現一個基于瀏覽器的終端界面。
WebSocket 連接:使用 WebSocket 連接連接 WebSSH 服務器后端。
SSH 連接:使用 ssh3.js 庫連接 SSH 服務器,然后在 WebSocket 和 SSH 之間建立一個雙向通訊。
服務器端代碼使用 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的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解析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。