簡體   English   中英

使用NodeJS和SocketIO通過Websockets提供圖像

[英]Serving Images over Websockets with NodeJS & SocketIO

我正在嘗試使用NodeJS和SocketIO開發一個非常簡單的圖像服務器。 我正在從事的項目要求我在頁面加載(客戶需求)時加載幾百張圖像。 當前,通過使用HTML“ img”標簽為每個圖像發出HTTP請求。 與HTTP或Ajax相比,Websocket的延遲減少了,整體效率降低了,我希望通過在Websocket上發送圖像來提高性能。

不幸的是,使用NodeJS從服務器的文件系統中讀取圖像並使用SocketIO通過websocket發送圖像的速度明顯慢於通過Apache服務的傳統HTTP請求。 下面是我的服務器代碼:

var express = require('express'),
    app = express(),
    http = require('http'),
    fs = require("fs"),
    mime = require('mime'),
    server = http.createServer(app),
    io = require('socket.io').listen(server);

server.listen(151);

io.sockets.on('connection',function(socket){
    socket.emit('connected');

    socket.on('getImageData',function(file,callback){
        var path = 'c:/restricted_dir/'+file;

        fs.readFile(path,function(err,data){
            if (!err){
                var prefix = "data:" + mime.lookup(path) + ";base64,";
                var base64Image = prefix+data.toString('base64');
                socket.emit('imageData',data,callback);
            }
        });
    });
});

我也嘗試過使用“ createReadStream”進行緩沖,但是我發現此操作沒有明顯的速度改進。 我還應注意,希望以Base64編碼的dataURI形式接收圖像數據,因此我可以將其簡單地放入“ img”標簽的“ src”屬性中。 我知道Base64意味着數據大小大約增加了30%,但是即使使用二進制圖像數據,它仍然比HTTP花費大約10倍的時間。

編輯:我想這里的真正問題是,“ websockets確實是服務靜態文件的最佳方法嗎?” 經過進一步的思考和補充閱讀,我強烈懷疑這里的問題與並行處理有關。 由於NodeJS在單個線程上運行,因此它不是服務所有這些靜態圖像文件的最佳解決方案嗎? 有人對此有任何想法嗎?

瀏覽器通常打開到同一服務器的多個連接以並行執行請求,並且每個連接也可以執行多個請求 ,而您只有一個websocket連接。

同樣,組合fs.readFile()/Base64-encode/socket.emit()引入了相當大的開銷,在這種情況下,常規的httpd可以使用sendfile()類的系統調用,甚至不必先觸摸文件內容即可。被發送到客戶端。

Node的單線程性質在這里不是問題,因為Node可以很好地執行I / O(這就是您正在做的事情,減去Base64編碼)。

所以我想說websockets不太適合靜態文件服務:)

暫無
暫無

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

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