使用NodeJS和SocketIO在Websockets上提供图像

我试图用NodeJS和SocketIO开发一个非常简单的图像服务器。 我正在处理的项目需要我在加载页面(客户需求)时加载数百个图像。 目前,通过使用HTML“img”标签对每个图像进行HTTP请求。 与HTTP或Ajax相比,WebSockets的延迟和整体效率都有所降低,我希望通过websockets发送图像来提高性能。

不幸的是,使用NodeJS从服务器的文件系统中读取图像,并通过使用SocketIO的websockets发送图像比通过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在单线程上运行,也许这不是提供所有这些静态图像文件的最佳解决scheme? 有没有人有这个想法?

浏览器通常打开到同一台服务器的多个连接来并行执行请求,也可以对每个连接执行多个请求 ,而只有一个websocket连接。

此外,组合fs.readFile()/Base64-encode/socket.emit()引入了一个很大的开销,一个普通的httpd可以使用像sendfile()这样的系统调用,甚至不需要在文件内容触及之前被发送到客户端。

Node的单线程本质不是问题,因为Node可以做I / O(这就是你正在做的事情,减去Base64编码)。

所以我会说,websockets不是很适合静态文件服务:)