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