簡體   English   中英

socket.io,node.js將映像從服務器轉發到客戶端

[英]socket.io, node.js forwarding image from server to client

我想通過node.js上的socket.io接收圖像,並將其轉發到客戶端(瀏覽器),但是無法識別通過消息發送到瀏覽器的圖像,因此無法顯示。

但是,當我首先在node.js服務器上保存消息/圖像並再次加載保存的文件以轉發圖像時,它可以正常工作。 我也可以從文件系統打開服務器上的jpeg文件,而不會出現問題。 直接從服務器發送另一個jpeg也可以正常工作。

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});
        });
    }

如果我簡化了用於轉發接收到的消息(msg)的功能,而沒有使用“ fs”解決方法,例如:

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

或以簡單的預期方式

socket.emit('serverImage',  msg);

該郵件將不會在瀏覽器上被識別為圖像,並且客戶端不會觸發該圖像的“ onload”事件。 客戶端代碼(可以與jpeg文件一起使用):

socket.on('serverImage', function(msg) { 
    var blob = new Blob([msg.buffer], {type: 'image/jpeg'} );
    var url = URL.createObjectURL(blob);
    var limg = new Image();
    limg.onload = function () {
        console.log(' -- image on load!');
        rcontext.drawImage(this, 0, 0);
        URL.revokeObjectURL(url);
    };
    limg.src = url; 
});

有沒有一種方法可以以某種方式采用/轉換消息,即編碼,無需“ fs”庫或任何其他建議即可直接識別?

非常感謝!

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});
        });
});

非常感謝您的答復,

我進行了進一步的測試,並通過使用一個額外的緩沖區變量(指定了socket.emit前面的類型)找到了解決方法/解決方案:

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

通過這一附加步驟,瀏覽器現在將消息識別為圖像。 非常感謝您的幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM