socket.io,node.js将图像从服务器转发到客户端

时间:2017-08-29 13:10:56

标签: javascript node.js websocket socket.io

我想通过node.js上的socket.io接收图像,并希望将其转发给客户端(浏览器),但是通过消息发送到浏览器的图像无法识别,因此无法显示。

但是,当我首先在node.js服务器上保存消息/图像并再次加载保存的文件以转发图像时,它可以正常工作。我也可以从文件系统中打开服务器上的jpeg文件而不会出现问题。直接从服务器发送不同的jpeg也可以按预期工作。

g.V('7112138f-fae6-4272-92d8-4f42e331b5e1').bothE('knows')

如果我简化了转发收到的消息(msg)的功能而没有" fs"解决方法,如:

socket.on('image', function(msg) {
        var fileName = 'clientImage.jpg';

        // First save the file 
        fs.writeFile(fileName, msg.buffer, function() {});

        // reload the image and forward it to the client
        fs.readFile(__dirname +'/clientImage.jpg', function(err, buf){
            socket.emit('serverImage', {image: true, buffer: buf});
        });
    }

或以简单的预期方式

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

该消息不会被识别为浏览器上的图像,并且客户端不会触发" onload"图像的事件。 客户端代码(适用于jpeg文件):

socket.emit('serverImage',  msg);

有没有一种方法可以以某种方式采用/转换消息,即编码,直接识别,而不需要" fs"图书馆或任何其他建议?

非常感谢!

2 个答案:

答案 0 :(得分:0)

writeFile是异步的。将文件写入磁盘需要时间。你传递了一个回调函数,但它是空的。重新读取该回调函数中的图像。

// First save the file 
fs.writeFile(fileName, msg.buffer
    , function() { // When writing is done (that's the important part)
       // reload the image and forward it to the client
       fs.readFile(__dirname +'/clientImage.jpg', function(err, buf){
            socket.emit('serverImage', {image: true, buffer: buf});
        });
});

答案 1 :(得分:0)

非常感谢回复,

我做了进一步的测试,并通过使用额外的缓冲区变量找到了一个变通方法/解决方案,指定了socket.emit前面的类型。

var nbuffer = new Buffer(msg.buffer,'image/jpeg');           
socket.emit('serverImage',  {image: true, buffer: nbuffer});

通过此附加步骤,浏览器现在将消息识别为图像。 非常感谢你的帮助!