监控Nodejs的性能实例代码

2020-06-17 05:50:00易采站长站整理

实现

原理讲完,我们来具体实现一下( 源码链接在这 )。

实现socket通信

首先,服务端和客户端分别引入 socket.io 和 socket.io-client , 分别初始化

服务端:


const app = new Koa();
const server = http.createServer(app.callback());
createSocketIO(server);

app.use((ctx): void => {
ctx.body = 'please connect use socket';
});

server.listen(port, (): void => {
console.log('server started at http://localhost:' + port);
});


//createSocketIO
const io = socketIO(server, {
pingInterval: 10000,
pingTimeout: 5000,
cookie: false
});
io.on('connect', (socket): void => {
socket.emit('msg', 'connected');
}

客户端:


var socket = this.socket = io('http://' + this.ip + ':3000')
socket.on('msg', (msg) => {
console.log(msg)
})
socket.on('error', (err) => {
alert('出错了' + err)
})

这样,服务端和客户端就通过socketio建立了链接。

实现桌面监控

之后我们首先要在服务端来截图,使用 screenshot-desktop 这个包


const screenshot = require('screenshot-desktop')

const SCREENSHOT_INTERVAL = 500;

export const createScreenshot = (): Promise<[string, Buffer]> => {
return screenshot({format: 'png'}).then((img): [string, Buffer] => {
return [ img.toString('base64'), img];
}).catch((err): {} => {
console.log('截图失败', err);
return err;
})
}

export const startScreenshotTimer = (callback): {} => {
return setInterval((): void => {
createScreenshot().then(([imgStr, img]): void => {
callback(['data:image/png;base64,' + imgStr, img]);
})
}, SCREENSHOT_INTERVAL)
}

然后通过socketio的emit来传到客户端:


startScreenshotTimer(([imgStr, img]): void => {
io.sockets.emit('screenshot', imgStr);
});

客户端收到图片后,设置到img的src上(这里是base64的图片url):


<img
class="screenshot"
:src="screenshot"
/>

data () {
return {
screenshot: ''
}
}

socket.on('screenshot', (data) => {
this.screenshot = data
})


其实这样就已经实现了桌面监控了,有兴趣的同学可以照着这个思路实现看看,并不是很麻烦。

当然这样的方案是有问题的,因为我们需要知道服务端桌面尺寸的大小,然后根据这个来调整客户端显示的图片尺寸。

实现这个细节是使用的 get-pixels 这个库,可以读取本地图片文件的宽度高度等信息,所以我先把图片写入本地,然后又读取出来,这样获取到的屏幕尺寸。