javascript – 无需直接许可即可估算用户的上传速度[已关闭]

前端之家收集整理的这篇文章主要介绍了javascript – 无需直接许可即可估算用户的上传速度[已关闭]前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想对用户上传速度进行粗略估计,无需获得直接的许可.这只是为了区分真正慢的连接与非常快的连接,所以精度不是很重要…

解决方法

这是使用 XMLHttpRequest扩展的 @Yiğit Yener’s概念的实现.

上传速度取决于两件事情:用户的连接速度和服务器的连接速度.我在这里假设你想测试用户和你的服务器之间的速度.而使用XMLHttpRequest,这是same-origin policy的唯一选择.

随着上传速度,你不需要返回任何东西.您只需要将大量数据发送到服务器上的任何页面.最简单的页面是您已经在打开的页面.为了做到这一点,你可以把url的domain部分完全放在.open()中. POST数据在一些服务器上被限制到两兆字节,所以我用一个是安全的.一个足以得到一个体面的阅读.

为了防止URL被缓存,我附加一个随机数到底.

url = '?cache=' + Math.floor( Math.random() * 10000 )

为了防止POST数据被gzip压缩,我使用随机数据.该函数允许您传递要检查的迭代次数.迭代间隔到每五秒.更新回调被调用每次迭代与该检查的速度,以及所有检查的移动平均值.使用尽可能多的迭代,希望获得所需的准确性.如果您只想粗略估计一次迭代就足够了.

这样叫:

checkUploadSpeed( 10,function ( speed,average ) {

} );

演示

你可以在这里试试这个代码.

私人服务器

你可以试试这个ThinkingStiff’s own server,这可能是这些中最快的.

堆栈代码片段

function checkUploadSpeed( iterations,update ) {
        var average = 0,index = 0,timer = window.setInterval( check,5000 ); //check every 5 seconds
        check();

        function check() {
            var xhr = new XMLHttpRequest(),url = '?cache=' + Math.floor( Math.random() * 10000 ),//random number prevents url caching
                data = getRandomString( 1 ),//1 meg POST size handled by all servers
                startTime,speed = 0;
            xhr.onreadystatechange = function ( event ) {
                if( xhr.readyState == 4 ) {
                    speed = Math.round( 1024 / ( ( new Date() - startTime ) / 1000 ) );
                    average == 0 
                        ? average = speed 
                        : average = Math.round( ( average + speed ) / 2 );
                    update( speed,average );
                    index++;
                    if( index == iterations ) {
                        window.clearInterval( timer );
                    };
                };
            };
            xhr.open( 'POST',url,true );
            startTime = new Date();
            xhr.send( data );
        };

        function getRandomString( sizeInMb ) {
            var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~!@#$%^&*()_+`-=[]\{}|;':,./<>?",//random data prevents gzip effect
                iterations = sizeInMb * 1024 * 1024,//get byte count
                result = '';
            for( var index = 0; index < iterations; index++ ) {
                result += chars.charAt( Math.floor( Math.random() * chars.length ) );
            };     
            return result;
        };
    };
    
    checkUploadSpeed( 10,average ) {
        document.getElementById( 'speed' ).textContent = 'speed: ' + speed + 'kbs';
        document.getElementById( 'average' ).textContent = 'average: ' + average + 'kbs';
    } );
<div id="speed">speed: 0kbs</div>
<div id="average">average: 0kbs</div>

的jsfiddle

演示所在的JSFiddle服务器速度较慢.

点击此按钮进入小提琴:

猜你在找的JavaScript相关文章