Node.js 实现远程桌面监控(二)

栏目: Node.js · 发布时间: 5年前

内容简介:上一篇文章中讲了远程桌面监控的实现思路。虽然是可用的,但有很多不好用的地方,于是我又进行了完善。我对这个工具的期望是我希望用户在用的时候,只要通过npm全局安装一个服务端的包,然后命令行启动服务端,在另一台机器全局安装客户端的包,也是命令行启动,这样就可以做到远程监控了。且命令行支持灵活地参数配置。这次迭代后的效果如下:

上一篇文章中讲了远程桌面监控的实现思路。虽然是可用的,但有很多不好用的地方,于是我又进行了完善。

我对这个 工具 的期望是我希望用户在用的时候,只要通过npm全局安装一个服务端的包,然后命令行启动服务端,在另一台机器全局安装客户端的包,也是命令行启动,这样就可以做到远程监控了。且命令行支持灵活地参数配置。

这次迭代后的效果如下: 演示

概览

列一下我做了哪些改动:

  1. 服务端支持命令行启动,支持参数设置

  2. 服务端支持 cosmiconfig 风格的配置

  3. 客户端支持网页的方式

  4. 客户端支持命令行启动

  5. 修改了键盘和鼠标不准的一些bug

  6. 添加了英文的README

详述

服务端支持命令行启动

我调试的时候直接使用node运行的js脚本,后来我一想,用户也这样的话就太麻烦了。应该通过图形界面或者命令行的方式,命令行的方式轻量一些。

实现是使用 yargs ,代码如下:

#!/usr/bin/env node
const yargs = require('yargs');
const conf = require('./Configuration').getInstance();

const script = yargs.scriptName("remote-monitor-server");

script.usage('$0 <cmd> [args]');

script.command('start', '启动服务器', (yargs) => {
  yargs.option('--port', {
    description: '端口号'
  })
  yargs.option('--monitorScreenshotInterval', {
    description: '截图间隔'
  })
  yargs.option('--controlEnable', {
    description: '是否允许远程控制'
  })
  yargs.option('--controlLog', {
    description: '是否打印鼠标键盘事件的日志'
  })
}, function (options) {
  if(options.port) {
    conf.setConfig('server.port', options.port)
  }
  if(options.monitorScreenshotInterval) {
    conf.setConfig('monitor.screenshotInterval', options.monitorScreenshotInterval)
  }
  if(options.controlEnable) {
    conf.setConfig('control.enable', options.controlEnable)
  }
  if(options.controlLog) {
    conf.setConfig('control.log', options.controlLog)
  }
  require('./index');//启动服务器
})

script.help();
script.argv

复制代码

在package.json中配置对应的bin字段,这样安装这个包的时候,这个文件就会被放到bin目录下了。

"bin": {
    "remote-monitor-server": "./dist/cli.js"
  }
复制代码

支持cosmiconfig风格的配置

因为服务端还是有很多地方需要配置的,比如截图的时间间隔、是否打印日志、是否允许客户端控制等,所以添加了对应的支持。

cosmiconfig是eslint还有stylelint实现配置文件查找的方式,你应该会很熟悉,就是如下的配置查找顺序

  • a package.json property
  • a JSON or YAML, extensionless "rc file"
  • an "rc file" with the extensions .json, .yaml, .yml, or .js.
  • a .config.js CommonJS module

然后在代码里面读取配置,我封装了一个Configuration类,因为全局唯一,所以做成单例:

const cosmiconfig = require('cosmiconfig');
import { get, set } from 'lodash';

const configFinder = cosmiconfig('remoteMonitorServer');

const defaultConfig = {
    monitor: {
        screenshotInterval: 500,// 截图的间隔
    },
    control: {
        enable: true,// 是否允许客户端控制
        log: true// 是否打印日志
    },
    server: {
        port: 3000// 服务器端口号
    }
}

let instance;

class Configuration {
    config: Object;
    constructor() {
        if(instance) {
           return instance;
        }
        this.config = Object.assign({}, defaultConfig, configFinder.searchSync().config);
        instance = this;
    }

    static getInstance() {
        if (!instance) {
            instance = new Configuration();
        }
        return instance;
    }

    getConfig(name) {
        return name ? get(this.config, name) : this.config;
    }
    
    setConfig(name, val) {
        set(this.config, name, val);
    }
}

module.exports = Configuration;

复制代码

用到配置的地方,通过单例的configuration来读取配置:

const configuration = require('./Configuration').getInstance();

configuration.getConfig('control.enable')
复制代码

这是配置文件的方式,当然我们命令行启动的的时候通过参数也可以配置,只需要参数处理的时候设置到configuration对象中就好了

if(options.monitorScreenshotInterval) {
    conf.setConfig('monitor.screenshotInterval', options.monitorScreenshotInterval)
  }
复制代码

客户端支持网页的方式

客户端只需要展示服务端传过来的图片,并且监听事件然后传递到服务端,其实并没有用到一些原生的api。使用electron打包成app的方式显的有些笨重了。所以我单独打包成了web下的文件,单独发到npm仓库,没有把electron的部分包括进去。

客户端支持命令行启动

打包后的客户端文件只是html还有关联的js和其他资源文件,只需要静态服务器启动起来就好,所以使用了 http-server

#!/usr/bin/env node

const childProcess = require('child_process');
const path = require('path');

childProcess.spawnSync('http-server', [ __dirname ], {
    stdio: 'inherit'
});
复制代码

然后配置package.json的bin字段

"bin": {
    "remote-monitor-client-web": "index.js"
  }
复制代码

修改了键盘和鼠标不准的一些bug

之前是服务端直接使用了客户端传递过来的keycode来执行事件,但我发现执行的结果是不对的,后来我看robot-js的文档后,改成了取robot.KEY_XXX的方式

public executeKeyboardEvent(event: KeyboardEvent): void {
        let keyCode = robot['KEY_' + event.keyName.toUpperCase()];
        if (!keyCode) {
            console.log('robot-js暂不支持' + event.keyName + '键');
            return;
        }
        switch(event.type) {
            case 'keydown':
                this.keyboard.press(keyCode);
                break;
            case 'keyup':
                this.keyboard.release(keyCode);
                break;
            case 'keypress':
                this.keyboard.click(keyCode);
                break;
            default:break;
        }
    }
复制代码

但是有一些键,比如方向键,robot-js是没有对应的keyCode的,所以做了拦截,这里后续还会做优化,现在只是解决了按键不准的问题。


以上所述就是小编给大家介绍的《Node.js 实现远程桌面监控(二)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Everything Store

The Everything Store

Brad Stone / Little, Brown and Company / 2013-10-22 / USD 28.00

The definitive story of Amazon.com, one of the most successful companies in the world, and of its driven, brilliant founder, Jeff Bezos. Amazon.com started off delivering books through the mail. Bu......一起来看看 《The Everything Store》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试