Skip to content

hourong88/xterm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

This project was bootstrapped with Create React App

说明:这个是基于xterm.js和websocket的react命令行终端demo

主要看consoleManagement文件夹,实际业务中是调试可行上线的。

需求:react框架,单个页面,用户名和密码连接远程服务器,本页面可以xterm控制远程服务器。通信方式是websoket连接。

主要调用xterm的几个方法:

  • onError
  • onConnect
  • onClose
  • onData

具体内容看注释

相关文档: https://xtermjs.org/

https://xtermjs.org/docs/api/terminal/classes/terminal/

https://xtermjs.org/docs/api/addons/fit/

最终实现效果,类似这样的:

https://xtermjs.org/blog/articles/2017-02-08-xtermjs-2.3

后续更新直接将可行的业务代码复制进去了,安装是跑不起来的,下载了直接看consoleManagement文件夹配合文档进行调试即可

关键代码:

 connect = (data) => {
    this.setState({
      settingVisible: false,
      termWindow: true,
      buttonVisible: false
    }, () => {
      this.handleToggleVisible.bind(this, 'settingVisible', false)
      //连接成功,与后端验证用户名和密码
      const option = {
        operate: 'connect',
        host: hostname,//IP
        port: '22',//端口号
        username: data.username,//用户名
        password: data.password,//密码*/
        module: "webssh"
      }
      //初始化
      this.termInit()
      // 换行并输入起始符“$”
      term.prompt = () => {
        term.write("\r\n$ ");
      };
      //定义与后端服务器连接地址
       let socket =   process.env.NODE_ENV === "production"
       ? new WebSocket(`ws://${host.split(":")[0]}:8008/websocket`)
       : new WebSocket(
         `ws${proxyIp.ip.slice(4).replace(/[0-9]{4}$/, "8008/websocket")}`
       );
      
      //键盘输入内容传给后端的方法
      term.onKey(e => {
        // console.log(e.key)
        socket.send(JSON.stringify({ "operate": "command", "command": e.key, module: "webssh" }));

      })
      //操作回调
      const operate = {
        onError: function (error) {
          //连接失败回调
          notification.error({
            message: "连接超时,请检查您的网络或输入的参数",
          });
          term.write('Error: ' + error + '\r\n');
        },
        onConnect: function () {
          //连接成功回调
          socket.send(JSON.stringify(option))  //连接成功的回调
        },
        onClose: function () {
          //连接关闭回调
          term.write("\rconnection closed");
        },
        onData: function (data) {
          //收到数据时回调
          term.write(data);
          term.focus()
        }
      }
      if (window.WebSocket) {
        //如果支持websocket
        // this._connection = new WebSocket(endpoint);
        console.log("good!!!")
      } else {
        //否则报错
        operate.onError('WebSocket Not Supported');
        return;
      }
      //连接成功
      socket.onopen = function () {
        operate.onConnect()
      };

      socket.onmessage = function (evt) {
        console.log(evt,evt);
        let data = evt.data.toString();
        console.log(data,"data");
        switch (data) {
          case '\r': 
          break;
          case '\u0003': 
            prompt(term);
            break;
          case '\u007F':
            if (term._core.buffer.x > 2) {
              term.write('\b \b');
            }
            break;
          default:
          term.write(data);
        }
      };

      socket.onclose = function (evt) {
        operate.onClose();
      };

    });
  };

About

xterm.js(4.x)+react+websoket

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors