javascript - 将图像缓冲区发送到 node.js tcp 服务器

标签 javascript node.js image sockets 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)

但它会以多个 block 的形式发送数据,因为我的控制台多次将随机乱码显示为新事件,所以我什至不知道该怎么做。任何帮助都会很棒。

最佳答案

除了混合编码(您的图像 Buffer 只是连接到字符串中)之外,您还将 TCP 流视为面向消息的协议(protocol)。

我建议您使用 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) );
});

关于javascript - 将图像缓冲区发送到 node.js tcp 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57516018/

相关文章:

node.js - 连接 socketcluster 服务器

angularjs - Node.js 从返回未定义的 MongoDB 获取请求

javascript - 使用 Nodejs 打印

image - ExpressJS : Retrieving images from MongoDB and displaying them in Jade

javascript - 用 jquery 添加一个 div 似乎不起作用

javascript - 加载页面时动态设置选择选项

javascript - 如何根据ReactJS中状态变量的值分配CSS类

javascript - 如何从接口(interface)或 promise 的内容中获取 "recieve" promise ?

java - 更新以 mysql blob 格式保存的图像

css - 链接可点击区域比其图像大?