使用NodeJS和&amp ;;通过Websockets提供图像SocketIO

时间:2013-11-19 20:02:36

标签: node.js websocket socket.io

我正在尝试使用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在单个线程上运行,也许它不是提供所有这些静态图像文件的最佳解决方案?有没有人对此有任何想法?

1 个答案:

答案 0 :(得分:2)

浏览器通常打开与同一服务器的多个连接以并行执行请求,并且还可以执行multiple requests per single connection,而您只有一个websocket连接。

此外,组合fs.readFile()/Base64-encode/socket.emit()引入了显着的开销,常规httpd可以使用sendfile()之类的系统调用,甚至在将文件内容发送到客户端之前甚至不必触摸文件内容

Node的单线程特性在这里不是问题,因为Node可以做I / O(这正是你正在做的,减去Base64编码)。

所以我想说websockets不太适合静态文件服务:)