websocket + xterm 前端实现网页版终端

简介

网页版终端就是能够在浏览器上操作服务器的终端,主要用websocket和xterm来实现。websocket负责与后端保持长连接,发送前端的请求给后端,并监听后端响应的数据。xterm是渲染前端终端的库,他负责监听用户的输入和打印服务端的输出。

安装

shell 复制代码
// 1. 安装xterm
npm i @xterm/xterm @xterm/addon-fit @xterm/addon-web-links
// 2. websocket是内置API无需安装

使用xterm

html 复制代码
<template>
  <div class="terminal-container">
    <div ref="terminalRef" class="terminal"></div>
  </div>
</template
typescript 复制代码
import {onMounted, onBeforeUnmount} from "vue";
import {Terminal} from "@xterm/xterm";
import {FitAddon} from "@xterm/addon-fit";
import {WebLinksAddon} from "@xterm/addon-web-links";

const terminal = new Terminal({
  cursorBlink: true,
  scrollback: 1000,
  rows: 30,
  cols: 100,
  theme: {
    background: '#1e1e1e',
    foreground: '#d4d4d4'
  },
});
const fitAddon = new FitAddon();
terminal.loadAddon(fitAddon);
terminal.loadAddon(new WebLinksAddon());

window.addEventListener('resize', resize);

const terminalRef = ref()

onMounted(() => {
  terminal.open(terminalRef.value);
  fitAddon.fit();
})

onBeforeUnmount(() => {
  window.removeEventListener('resize', resize);
})

function resize() {
  fitAddon.fit();
}

以上代码会将终端渲染到页面上,并出现跳动的光标。但是当你使用键盘输入时,会发现页面上没反应,因为它和普通的输入框不一样,并不会直接将你输入的内容显示到页面上。

我们需要用到的方法只有两个

  1. onData 监听用户输入,用户每输入一个字符,都会触发该方法。
  2. write 向终端写入日志

但是不要在onData里直接调用write写入日志,正常的流程为:onData监听用户输入 -> 使用websocket将输入的字符发送给后端 -> 后端将收到的字符原封不动的返回给前端 -> 前端监听到websocket消息后调用write方法写入终端。

总而言之,前端只需要做两件事,1. 把用户输入的字符传给后端。2. 把websocket监听到的消息写入终端

使用websocket监听消息

ts 复制代码
const socket = new WebSocket(url);
socket?.addEventListener('message', (event: any) => {
    try {
      const msg = JSON.parse(event.data);
      // 解析后端响应的消息,Op === 'stdout', 则为标准输出,写入终端
      if (msg.Op === 'stdout') {
        terminal.write(msg.Data);
      }
    } catch (e) {
      // 非 JSON 消息直接写入终端
      terminal.write(event.data);
    }
});

监听用户输入

ts 复制代码
terminal.onData((data: any) => {
  // stdin 为标准输入,格式化为json字符串后发送给后端
  socket.seed(JSON.stringify({"Op":"stdin","Data": data}))
})

总结

网页版终端总体流程如下

网页终端 <--> 前端脚本 <--> websocket <--> 后端服务 <--> 服务器终端

用户在网页上操作终端时,经过前端脚本、websocket、后端服务最终到服务器终端,其中前端脚本、websocket、后端服务只负责转发和通信的功能,所以这套流程就相当于用户在浏览器直接操作服务器终端。

相关推荐
子兮曰6 小时前
Bun v1.3.14 深度解析:Image API、HTTP/3、全局虚拟存储与五十项变革
前端·后端·bun
kyriewen7 小时前
今天,百年巨头一次砍了9200人,而一个离职科学家的实话让全网睡不着觉
前端·openai·ai编程
问心无愧05137 小时前
ctf show web 入门42
android·前端·android studio
kyriewen8 小时前
老板逼我上AI,我偷偷在浏览器里跑LLaMA,省下20万API费
前端·react.js·llm
Beginner x_u8 小时前
前端八股整理(手写 02)|数组转树、数组扁平化、随机打乱一个数组
前端·数组·数组转树·数组扁平化
KaMeidebaby8 小时前
卡梅德生物技术快报|禽类成纤维细胞 FISH 实验:鸟类性别染色体基因定位技术实现与数据验证
前端·数据库·其他·百度·新浪微博
天若有情6738 小时前
前端高阶性能优化:跳出传统懒加载与预加载,基于用户行为做轻量预判加载
前端·性能优化
小小小小宇8 小时前
前端转后端:SQL 是什么
前端
张元清9 小时前
React Observer Hooks:7 种监听 DOM 而不写样板代码的方式
前端·javascript·面试
广州华水科技10 小时前
单北斗GNSS变形监测是什么?主要有怎样的应用与优势?
前端