我已经看到了一些问题不回答这个问题,有没有可能使用Java脚本来检查某人的带宽和负载基于它的具体内容?
英国广播公司,似乎可以用我的手机和中间的地方时给我的低质量的图像。
通过这个看起来这凉爽的服务做到这一点和它的一个CDN所以它可能是服务器端。
http://www.resrc.it/docs/
有谁知道他们是如何做到的呢? 或如何,我可以使用asp.net或JavaScript,或者在社区开源插件做到这一点。
我认为这可能与https://github.com/yahoo/boomerang/ ,但不知道这是它的真正目的。
基本上,你这样做是这样的:
- 启动计时器
- 通过调用Ajax加载固定大小的文件例如图像
- 停止计时器
- 取一些样品,并计算平均badwidth
Somethign这样可以工作:
//http://upload.wikimedia.org/wikipedia/commons/5/51/Google.png
//Size = 238 KB
function measureBW(cnt, cb) {
var start = new Date().getTime();
var bandwidth;
var i = 0;
(function rec() {
var xmlHttp = new XMLHttpRequest();
xmlHttp.open('GET', 'http://upload.wikimedia.org/wikipedia/commons/5/51/Google.png', true);
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState == 4) {
var x = new Date().getTime() - start;
bw = Number(((238 / (x / 1000))));
bandwidth = ((bandwidth || bw) + bw) / 2;
i++;
if (i < cnt) {
start = new Date().getTime();rec();
}
else cb(bandwidth.toFixed(0));
}
};
xmlHttp.send(null);
})();
}
measureBW(10, function (e) {
console.log(e);
});
不是var xmlHttp = new XMLHttpRequest();
不能在所有的浏览器,你应该检查用户代理,并使用正确的
当然还有它只是一个估计值。
继承人JSBin例子
- 启动一个定时器。
- 发送AJAX请求到服务器,要求已知大小的文件。
- 当AJAX请求的完成加载,停止计时,并从过去的时间和文件大小计算的带宽。
与JavaScript的问题是,用户可以将其禁用。 (这是手机上较为常见,这恰好是与更小的图像更好)
我敲了这件事基于时序图像下载(参考: http://www.ehow.com/how_5804819_detect-connection-speed-javascript.html )
提醒一句,虽然 :
它说,我的速度为1.81Mbps,
但根据我的SpeedTest.Net速度是这样的:
定时下载的逻辑似乎是正确的,但不知道这是否是准确的?
嗯,就像我在我的评论说,你可以选择2种方法:
1)你是一个移动应用程序的情况下,那么你就可以查询所用的设备直接,所以你可以通知服务器直接的内容,您地区的什么类型(和大小),能渲染技术。 我觉得手机的差距可以帮助你访问某些本地移动API的使用JavaScript的。
2)服务器的计时器的事情。 您可以自己“服务”的一些文件,让你在你的着陆页有一个神奇的文件,即,只要客户端请求的文件,你抢了自定义处理该HTTP请求。 你“手动”写入到输出流提供服务的文件,而你衡量字节发送,并花了到达EOF的时候,那么你就可以以某种方式测量带宽。 与会话cookie结合这一点,你必须每个连接的浏览器信息。
虽然这不是一个答案,可能要注意,测量带宽并不总是可靠是很重要的。
http://www.smashingmagazine.com/2013/01/09/bandwidth-media-queries-we-dont-need-em/
套用上面的:
...位的数量通过下载的它采取下载它们的时间划分...当你下载了一个预热TCP连接的大文件是真实的。 这是很难实现的。 典型的页面加载场景:
- 最初的HTML页面使用慢启动机制下载,所以测量将显著低估可用带宽
- CSS和JavaScript的外部资源加载 - 新的TCP连接的集合,都在各自的慢启动阶段,他们不一定都是相同的目标服务器
- 图像加载 - 多个连接,每一个下载资源。 问题是,这些连接并不总是在其生命周期的同一阶段。 有些人可能是在慢启动阶段; 有些可能已患有丢包,因此,降低了他们的窗口,他们正在试图填补的带宽; 有的可能是预热的TCP连接,准备填补的带宽。 这些TCP连接不一定都是相同的目标服务器上,并朝不同的目标服务器带宽可能是彼此之间的不同。
因此,估计带宽是可能的,但它远非如此简单,并且可以只用于页面加载过程的某些阶段。 而且因为有各种目标服务器几个TCP连接是常见的(例如,CDN可以托管的Web页面的图像资源),我们真的不能告诉什么是我们想要测量的带宽。
由于这是一个老问题,在文章末尾的替代建议是考虑到最近srcset
属性为响应图像,它可以让浏览器决定要加载基于什么它知道哪些资产(这应该是比我们更) 。 这听起来像它的权重更倾向于刚刚确定的分辨率 ,但也许是支持上升,它会变得更加聪明。
我已经发布了BwCh这是一个开源的JavaScript API来检测基于Web的环境带宽
它是建立与ES2015。 它为了提供一个灵活的方法来检测带宽为移动设备和桌面设备使用了一些最新的JavaScript创新(window.navigator.connection目前在Chrome支持48+的Android作为2016年4月的)的。 这回退/补充到图像预载检测带宽其中那些最新的API不可用。