我正在尝试使用NodeJS& amp;开发一个非常简单的图像服务器。 SocketIO。我正在处理的项目要求我在页面加载(客户要求)上加载数百个图像。目前,通过使用HTML“img”标签为每个图像发出HTTP请求。与HTTP或Ajax相比,webockets的延迟和整体效率降低了,我希望通过在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在单个线程上运行,也许它不是提供所有这些静态图像文件的最佳解决方案?有没有人对此有任何想法?
答案 0 :(得分:2)
浏览器通常打开与同一服务器的多个连接以并行执行请求,并且还可以执行multiple requests per single connection,而您只有一个websocket连接。
此外,组合fs.readFile()/Base64-encode/socket.emit()
引入了显着的开销,常规httpd可以使用sendfile()
之类的系统调用,甚至在将文件内容发送到客户端之前甚至不必触摸文件内容
Node的单线程特性在这里不是问题,因为Node可以做I / O(这正是你正在做的,减去Base64编码)。
所以我想说websockets不太适合静态文件服务:)