Socket io, node js, Простой пример отправки изображений/файлов с сервера на клиент

Есть ли простые и прямые примеры того, как подавать изображение? от сервера к клиенту? через буферизацию или просто прямой вызов для загрузки? (цель состоит в том, чтобы эффективно получать файлы изображений в режиме реального времени, чтобы сортировать настоящий поток изображений в прямом эфире) и добавлять к тегу html-изображения или только в теле страницы html.

неполный пример кода: (в основном полученный из официального образца или только коды из stackoverflow)

index.js

// basic variables
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

var fs = require('fs'); // required for file serving

http.listen(3000, function(){
  console.log('listening on *:3000');
});

// location to index.html
app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

// only to test chat sample code from sample
io.on('connection', function(socket){

  console.log('a user connected');
    // broadcast a message
  socket.broadcast.emit('chat message', 'System Broadcast Message: a user has been connected');
  socket.on('chat message', function(msg){
    io.emit('chat message', msg);
  });

// trying to serve the image file from the server
io.on('connection', function(socket){
  fs.readFile(__dirname + '/images/image.jpg', function(err, buf){
    // it possible to embed binary data
    // within arbitrarily-complex objects
    socket.emit('image', { image: true, buffer: buf });
    console.log('image file is initialized');
  });
});

(клиентская html-страница) index.html(мы перейдем к преследованию только с той частью, которая служит изображению). Что мы можем сделать на стороне клиента, чтобы получить файл и отобразить изображение на странице html?

  socket.on("image", function(image, buffer) {
     if(image)
     {
         console.log(" image: from client side");
         // code to handle buffer like drawing with canvas** <--- is canvas drawing/library a requirement?  is there an alternative? another quick and dirty solution?
        console.log(image);
        // what can we do here to serve the image onto an img tag?
     }

 });

спасибо за чтение


Обновление:

после фрагментов кода снизу также необходимо было изменить переменную "buffer" на image.buffer, чтобы изображение отображалось правильно.

в основном изменить строку из

img.src = 'data:image/jpeg;base64,' + buffer;

Для

img.src = 'data:image/jpeg;base64,' + image.buffer;

Ответ 1

Одним из возможных решений является base64-кодирование данных изображения и использование этого в браузере через image.src:

На стороне сервера попробуйте изменить это:

socket.emit('image', { image: true, buffer: buf });

:

socket.emit('image', { image: true, buffer: buf.toString('base64') });

Затем на стороне клиента:

var ctx = document.getElementById('canvas').getContext('2d');

// ...

socket.on("image", function(info) {
  if (info.image) {
    var img = new Image();
    img.src = 'data:image/jpeg;base64,' + info.buffer;
    ctx.drawImage(img, 0, 0);
  }
});