【发布时间】:2016-09-08 16:13:21
【问题描述】:
我已经实现了一个基于 Web 的客户端-服务器系统。目标是通过套接字向服务器请求图像文件。
这是我在客户端的代码。 [嵌入Javascript代码]
<a id="downloadLnk" download="new.jpeg" style="color:red">Download as image</a>
var socket = io("ipaddress");
socket.on("image", function(info) {
if (info.image) {
var end1 = new Date().getTime();
document.getElementById("demo1").innerHTML = end1;
var img = new Image();
img.src = 'data:image/jpeg;base64,' + info.buffer;
}
function download() {
this.href = img.src;
};
downloadLnk.addEventListener('click', download, false);
});
这是服务器端的代码:[node.js server, express module, fs module]
io.on('connection', function(socket){
var start1 = new Date().getTime();
console.log(start1);
fs.readFile(__dirname + '/aorta-high512.jpg', function(err, buf){
socket.emit('image', { image: true, buffer: buf.toString('base64') });
});
});
我正在传输大小为 88KB 的 512x512 分辨率图像,它大约需要一秒钟。同样,对于 259KB 的文件大约需要 1.2 秒,而 2MB 的文件则需要 2.5 秒。我不明白为什么要花这么多时间? 我在 speedtest.net 中检查了我的网络的可用带宽和网速。下载速度95.97Mbps,上传速度23.30Mbps。
能否请您告诉我,为什么数据传输时间这么慢?有没有其他方法可以更快地传输数据?我绝对知道 96Mbps 是可用的带宽,但为了测试,我从 Internet 下载了一个 100Mb 的 pdf 文件,大约需要 12-14 秒。看着这个,我至少期望以至少 2-3 Mbps 的速率更快地传输数据。
【问题讨论】:
-
转换为 base64 并返回需要时间(和更多空间)。您是否尝试仅使用原始二进制数据? Socket.io 支持发送/接收二进制数据。
-
谢谢。是的,我尝试向客户端发送二进制原始缓冲区,它节省了很多时间。现在我的 1.5Mb 文件需要大约 150 毫秒来传输。但是,当客户端收到文件时,我下载文件,即通过将 img.src 设置为 href 使用 download() 函数保存它。通过这种方法,我无法保存大于 1.7 Mb 的文件,不知道是什么问题。有什么建议吗?
-
您可能遇到了浏览器限制。如果是这样,您可以通过堆叠多个 img 标签并在它们之间拆分数据以减少每个图像的 base64 长度来解决此问题。如果您想将其实际下载到磁盘而不是在 DOM 中显示,那么您可能必须通过单独的 HTTP GET 从服务器下载它。
-
是的,我之前尝试过 HTTP GET。是的,我可以从服务器下载任何大小的文件。但是,我的主要目标是确定数据从服务器传输到客户端所花费的时间,在这种情况下是下载时间。而且我找不到任何方法来计算这个下载时间。所以我选择了套接字方法来计算时间。
-
@mscdex : 你能把评论改写为这里的答案吗?你说的解决方案已经解决了,并且正在运行。
标签: javascript node.js sockets client-server