【问题标题】:Why does datatransfer between sockets takes lot of time?为什么套接字之间的数据传输需要很多时间?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-11
    • 2012-01-14
    • 2011-04-22
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多