[英]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.