为什么套接字之间的数据传输需要很多时间?

Why does datatransfer between sockets takes lot of time?

我实现了一个基于网络的客户端-服务器系统。目标是通过套接字向服务器请求图像文件。

这是我在客户端的代码。 [内嵌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 是可用带宽,但仍然要测试我从互联网上下载一个 100Mb pdf 文件大约需要 12-14 秒。看看这个,我至少期望以至少 2-3 Mbps 的速率更快地传输数据。

Socket.IO 支持 sending/receiving 二进制数据,因此利用它可以避免昂贵的数据编码。

其次,当 generating/using 数据 URL 在浏览器中时,您必须注意 URL 长度。许多浏览器对此类数据的最大大小施加了各种限制 URLs。一种可能的解决方法(不包括通过 HTTP GET 直接提供图像)可能包括让服务器将图像拆分为一组较小的图像,然后您将这些图像与堆叠的 img 标签一起使用以提供单个图像的外观图片。