vue+xterm+SockJS实现终端

需求:用vue、xtrerm、sockJS实现一个终端;
实现效果如下:
在这里插入图片描述实现难点:主要是与服务端建立连接,后端用的sockJS前端保持一致,其实xterm中自带了websocket;视图展示用的xterm;
xterm.js官方文档
sockjs-client

主要代码逻辑:

<template>
  <div id="term" class="term"></div>
</template>
<script>
import 'xterm/css/xterm.css'
import { Terminal } from 'xterm'
import { FitAddon } from 'xterm-addon-fit'
import SockJS from 'sockjs-client'
 mounted() {
    this.initSocket()
  },
  methods: {
    initSocket() {
      //连接路径
      if (this.socketURL == '') {
        return
      }
      this.socket = new SockJS(this.socketURL)
      this.socketOnOpen()
      this.socketOnMessage()
      this.socketOnClose()
      this.socketOnError()
    },
    socketOnOpen() {
      this.socket.onopen = () => {
        console.log('web链接成功')
        //发送格式与后台保持一致要不发送也是失败的
        this.socket.send(
          JSON.stringify({
            Op: 'bind',
          })
        )
        this.initTerm()
      }
    },
    initTerm() {
      this.term = new Terminal({
        rendererType: 'canvas', //渲染类型
        disableStdin: false, //是否应禁用输入
        windowsMode: true, //根据窗口换行
        cursorBlink: true, //光标闪烁
        cursorStyle: 'underline', //光标样式
        theme: {
          foreground: '#ececec', //字体
          background: '#000', //背景色
          lineHeight: 16
        }
      })
      let element = document.getElementById('term')
      this.term.open(element)
      const fitAddon = new FitAddon() //全屏插件
      this.term.loadAddon(fitAddon)
      //自适应大小(使终端的尺寸和几何尺寸适合于终端容器的尺寸)
      this.fitAddon = fitAddon
      this.fitAddon.fit()
      this.term.focus()
      this.term.onData(data => {
        let dataMessage = data
        //将输入的命令通知给后台,后台返回数据
          if (data === '\r') {
            data = '\n'
          } else if (data === '\u0003') {
            // 输入ctrl+c
            data += '\n'
          }
          this.socket.send(
            JSON.stringify({
              Op: 'stdin',
              Data: dataMessage,
              Cols: this.term.cols || 30,
              Rows: this.term.rows || 20
            })
          )
      })
      //接受服务器返回的结果并将结果显示到term中
    socketOnMessage() {
      this.socket.onmessage = evt => {
        this.term.write(JSON.parse(evt.data).Data)
      }
    },
    socketOnClose() {
      this.socket.onclose = () => {
        this.socket.close()
        console.log('关闭 socket')
      }
    },
    socketOnError() {
      this.socket.onerror = () => {
        console.log('socket 链接失败')
      }
    },
  }
</script>

开发过程中遇到的痛点就是调试时很麻烦;后来后台将项目打包之后我本地起服务才能写单独的html页面去进行调试的但是和项目还是有出入;
这样比 打包到uat上去查问题方便一点 但是已经不是什么好的解决方案 调试的时候真的是有点烦躁~~
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Vue 中使用 xterm.js 和 WebSocket 实现终端,你需要将用户输入的命令发送给后端,然后将后端返回的结果输出到 xterm.js 终端中。以下是一个简单的示例: ```html <template> <div id="terminal"></div> </template> <script> import { Terminal } from 'xterm'; import { FitAddon } from 'xterm-addon-fit'; export default { data() { return { socket: null, // WebSocket 实例 term: null, // Terminal 实例 }; }, mounted() { // 创建 WebSocket 实例 this.socket = new WebSocket('ws://localhost:8080'); // 创建 Terminal 实例 this.term = new Terminal(); const fitAddon = new FitAddon(); this.term.loadAddon(fitAddon); this.term.open(document.getElementById('terminal')); // 处理 WebSocket 消息 this.socket.onmessage = (event) => { this.term.write(event.data); }; // 处理输入事件 this.term.onData(data => { this.socket.send(data); }); // 调整终端大小 this.term.onResize(size => { const cols = size.cols; const rows = size.rows; this.socket.send(JSON.stringify({ type: 'resize', cols, rows })); }); // 发送 resize 消息 const cols = this.term.cols; const rows = this.term.rows; this.socket.send(JSON.stringify({ type: 'resize', cols, rows })); }, beforeDestroy() { // 关闭 WebSocket 连接 this.socket.close(); } } </script> ``` 以上代码中,我们首先在 `mounted` 钩子函数中创建了一个 WebSocket 实例和一个 Terminal 实例。然后我们为 WebSocket 实例添加了一个 `onmessage` 事件监听器,该监听器会在接收到服务器返回的消息时触发,我们在该事件处理函数中将消息输出到终端中。 接着,我们为 Terminal 实例添加了一个 `onData` 事件监听器,该监听器会在用户输入时触发,我们在该事件处理函数中向服务器发送用户输入的命令。同时,我们还为 Terminal 实例添加了一个 `onResize` 事件监听器,该监听器会在终端大小调整时触发,我们在该事件处理函数中向服务器发送终端大小变化的消息。 最后,我们在 `beforeDestroy` 钩子函数中关闭了 WebSocket 连接。 需要注意的是,以上代码中的 WebSocket 连接是通过 `ws://localhost:8080` 连接本地服务器的,你需要根据实际情况修改 WebSocket 连接地址。另外,代码中的消息格式和处理逻辑也需要根据实际情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值