gpt4 book ai didi

node.js - 使用 NodeJS 和 SocketIO 通过 Websockets 提供图像

转载 作者:太空宇宙 更新时间:2023-11-03 23:42:47 25 4
gpt4 key购买 nike

我正在尝试使用 NodeJS 和 SocketIO 开发一个非常简单的图像服务器。我正在从事的一个项目要求我在页面加载时加载数百张图像(客户要求)。目前,通过使用 HTML“img”标签对每个图像发出 HTTP 请求。与 HTTP 或 Ajax 相比,Websocket 延迟时间更短,整体效率更高,因此我希望通过通过 Websocket 发送图像来提高性能。

不幸的是,使用 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 在单线程上运行,也许它不是服务所有这些静态图像文件的最佳解决方案?有人对此有什么想法吗?

最佳答案

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

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

Node 的单线程特性在这里不是问题,因为 Node 可以很好地执行 I/O(这就是您正在做的事情,减去 Base64 编码)。

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

关于node.js - 使用 NodeJS 和 SocketIO 通过 Websockets 提供图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20080941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com