javascript - 将图像缓冲区发送到 node.js tcp 服务器
问题描述
我正在尝试将图像数据从我的 TCP 客户端发送到我的 TCP 服务器,它们都是用 node.js 编写的
我已经尝试过这样做
客户:
function onData(socket, data) {
var data = Buffer.from(data).toString()
var arg = data.split(',')
var event = arg[0]
console.log(event)
if (event == 'screenshot') {
console.log(hostname)
console.log('control client uid ' + arg[1] + 'then we screenshot')
screenshot()
.then(img => {
console.log(img)
socket.write('screenshotData,' + ',' + hostname + ',' + img)
socket.write('stdout,' + arg[2] + ',Screenshot')
})
.catch(err => {
console.log(err)
socket.write('error', err)
})
}
}
服务器:
sock.on('data', function(data) {
//right here i need to parse the first 'EVENT' part of the text so i can get cusotom tcp events and
var data = Buffer.from(data).toString()
var arg = data.split(',')
var event = arg[0]
if (event == 'screenshotData') {
agentName = arg[1]
img = arg[2]
console.log('agent-name ' + agentName)
console.log('screnshotdata' + img)
var dt = dateTime.create()
var formattedTime = dt.format('Y-m-d-H-M-S')
var folder = 'adminPanel/screenshots/'
var filename = formattedTime + '-' + agentName + '.png'
console.log(filename)
fs.writeFile(folder + filename, img, function(err) {
console.log(err)
})
}
})
我不得不在 TCP 中构建一些基本的事件系统。如果您知道更好的方法,请告诉我。无论如何,客户端会截取屏幕截图,然后就可以了socket.write('screenshotData', + ',' + hostname + ',' img)
。
但是它以多个块的形式发送数据,因为我的控制台多次将随机乱码显示为新事件,所以我什至不知道该怎么做。任何帮助都会很棒。
解决方案
Buffer
除了混合编码(您的图像只是连接到字符串中)之外,您还将 TCP 流视为面向消息的协议。
我建议你用websockets切换 TCP 流。界面基本上保持不变(read
替换为message
事件,类似的东西),但它实际上表现得像你期望的那样。
工作服务器:
const WebSocket = require('ws');
const fs = require('fs');
const PORT = 3000;
const handleMessage = (data) => {
const [action, payload] = data.split(',');
const imageData = Buffer.from(payload, 'base64');
const imageHandle = fs.createWriteStream('screenshot.jpg');
imageHandle.write(imageData);
imageHandle.end();
console.log(`Saved screenshot (${imageData.length} bytes)`);
};
const wss = new WebSocket.Server({port: PORT});
wss.on('connection', (ws) => {
console.log('Opened client');
ws.on('message', (data)=>handleMessage(data));
});
console.log('Server started');
客户:
const WebSocket = require('ws');
const screenshot = require('screenshot-desktop');
const PORT = 3000;
const sendImage = ( client, image ) => {
const payload = image.toString('base64');
const message = ["screenshot", payload].join(',');
console.log(`Sending ${image.length} bytes in message ${message.length} bytes`);
client.send(
message,
() => {
console.log('Done');
process.exit(0);
}
);
};
const client = new WebSocket('ws://localhost:'+PORT+'/');
client.on('open', () => {
console.log('Connected');
screenshot().then( image => sendImage(client, image) );
});
推荐阅读
- docker - 无法获得 D-Bus 连接:不允许操作 [docker]
- css - 图像高度失真
- python - 使用类构造函数来处理图像 tkinter
- javascript - 网页加载时如何自动粘贴复制的文本?
- sql - 如何在 oracle 数据库 SQL-92 标准搜索查询中进行更可靠的搜索?
- java - 单击 Button-java.lang.IllegalStateException 后应用程序崩溃:无法执行 android:onClick 的方法
- javascript - 在反应中从api获取数据
- python - Matplotlib 水平条图(barh):为什么条在顶部而不是彼此相邻?
- winapi - 如何在 Windows 32 位 x86 程序集中获取 EXCEPTION_POINTERS?
- c - 有没有办法在空终止字节之后检查字符串内容?