AS3 тест скорости загрузки - PullRequest
       63

AS3 тест скорости загрузки

3 голосов
/ 13 февраля 2012


Я делаю быстрый тест на AS3. И получил такую ​​проблему.
Я использую URLLoader( ) в своем тесте, и для теста загрузки это работает очень хорошо, но для загрузки теста у меня возникли некоторые проблемы. Я отправляю некоторые двоичные данные в свой php-скрипт и проверяю progress_event, чтобы получить bytesLoaded, чтобы вычислить текущую скорость, но событие не отправляется, при отправке всего файла появляется только complete_event. Итак, как я могу определить скорость процесса отправки байтов?

P.S. Я не могу использовать fileReference, потому что я использую свои тесты один за другим и не могу заставить пользователей щелкать в диалоге filebrowse ().

Thx.

        public function startme( ):void {

             _startTime = ( new Date( ) ).getTime( );

        var req:URLRequest = new URLRequest();
        req.url = "http://smart.t3a.ru/speedtest/test.php";
        req.contentType = 'application/octet-stream';
        req.method = URLRequestMethod.POST;
        req.data = Obj;

        //req.requestHeaders.push( new URLRequestHeader( 'Cache-Control', 'no-cache' ) );

        _loader = new URLLoader();
        _loader.dataFormat = URLLoaderDataFormat.BINARY;
        _loader.addEventListener(Event.COMPLETE,uploadComplete);
        _loader.addEventListener(ProgressEvent.PROGRESS, uploadProgress );
        _loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, onstatus);
        _loader.addEventListener(IOErrorEvent.IO_ERROR, eIOError);
        _loader.load(req);


    }

    private function onstatus(event:HTTPStatusEvent):void
    {
        trace(event);
    }
    private function eIOError(event:IOErrorEvent):void
    {
        trace(event);
    }

    private function uploadComplete( e:Event ):void
    {
        var endTime:Number = ( new Date( ) ).getTime( );
        var totalTime:Number = ( endTime - _startTime ) / 1000;

        var totalKB:Number = Obj.length * 8 / 1024;
        //_speed = totalKB / totalTime;

        if (debug)
        {
            trace( "U total time: " + totalTime + " total KB: " + totalKB + " speed: " + speed + "KBps" );
        }

        dispatchEvent( e );
    }

    private function uploadProgress( e:ProgressEvent ):void
    {
        var endTime:Number = ( new Date( ) ).getTime( );
        var totalTime:Number = ( endTime - _startTime ) / 1000;
        if (totalTime > 1)
        {
            var totalKB:Number = e.bytesLoaded * 8 / 1024;
            _speed = totalKB / totalTime;

            if (debug)
            {
                trace( "u total time: " + totalTime + " total KB: " + totalKB + " speed: " + speed + "KBps" );
            }
            dispatchEvent( e );

        }
        if (totalTime > 7)
        {

            var ec:Event = new Event(Event.COMPLETE);
            _loader.dispatchEvent(ec);
            _loader.close();
        }
    }

UPD Мой php скрипт:

    <?
    $postdata = file_get_contents("php://input");
    file_put_contents("inp.bin",var_export($postdata,true));
    echo "Done";
    ?>

Да, он маленький, но мне действительно не нужны данные, мне нужно проверить, насколько быстро он загружен.

UPD 2

Итак, после прочтения всех ответов, комментариев и поисков в течение нескольких часов, я, вероятно, нашел решение, но оно сделано не так, как хотелось бы в начале. В любом случае, TYVM all, скоро выложу решение.

Ответы [ 6 ]

1 голос
/ 24 февраля 2012

Вместо того, чтобы полагаться на срабатывание ProgressEvent , попробуйте добавить прослушиватель ENTER_FRAME и извлечь bytesLoaded из экземпляра _loader.Если ENTER_FRAME работает, вы можете попытаться заменить его повторяющимся TimerEvent с небольшой задержкой, чтобы уменьшить нагрузку по обработке ENTER_FRAME.

Я не могу сейчас это проверить, ноэто должно по крайней мере сообщить вам, если это проблема с ProgressEvent, не запускающим или самой потоковой передачей.

1 голос
/ 13 февраля 2012

Попробуйте добавить это и посмотреть, если вы получаете ошибку. Это может быть проблемой.

_loader.addEventListener("ioError", ldrError);    

function ldrError(evt:*):void
{
    trace("ERROR");
}

Возможно, проблема в вашем PHP-скрипте.

0 голосов
/ 05 марта 2013

Причина, по которой ваши ProgressEvents не запускаются, заключается в том, что они относятся к загрузке части вашего запроса (т. Е. К ответу с сервера), а не к части загрузки.Если бы ответ сервера был значительным (скажем, в виде большого изображения), вы наверняка бы увидели ProgressEvents, но поскольку ваш скрипт только возвращает небольшой объем текста, он завершается очень быстро после завершения загрузки, до того какв любой момент URLLoader может отправить ProgressEvent.

Использование класса FileReference, как вы упомянули, является единственным способом, которым Flash может проанализировать выполняемую загрузку, но, конечно, он имеет ряд ограничений.

Мой совет - настроить ваш URLLoader с полезной нагрузкой POST известного размера, а затем сохранить new Date().getTime() непосредственно перед вызовом метода загрузки.Как только событие COMPLETE будет возвращено, снова получите текущее время и сравните, чтобы получить среднюю скорость загрузки, основанную на размере полезной нагрузки.Обратите внимание, что это только приблизительное значение, поскольку оно неизбежно включает в себя также часть загрузки, поэтому ваши расчетные скорости будут немного ниже, чем на самом деле.

Еще один обходной путь - отслеживать ход выполнения и скорость загрузки нана стороне сервера, и сообщайте об этом, регулярно делая Flash-вызовы в отдельный скрипт выполнения загрузки, пока все данные не будут переданы.

0 голосов
/ 25 февраля 2012

Похоже, серверный скрипт содержит ошибку. Который будет быстро возвращать ответ, который не вызовет progressEvent.
В этом случае может возвращаться что-то вроде кода ошибки, бла-бла-бла, в строке XX.
В таком случае запускается событие complete, так как клиент получил ответ. (200 ОК)


Вы убедились, что сценарий на стороне сервера в порядке?

0 голосов
/ 24 февраля 2012

Интересно, как быстро вы смогли протестировать в направлении загрузки и столкнулись ли вы с какими-либо проблемами с системами Windows? Кажется, я сталкиваюсь с каким-то узким местом в системах Windows, использующих различные браузеры, где моя загрузка достигает максимальной скорости ~ 25 Мбит / с. В системах Mac OS и Linux я достигаю скорости линии ~ 100 Мбит / с.

0 голосов
/ 13 февраля 2012

Может быть, я нашел это, не используйте симулятор загрузки, загружайте / скачивайте по-настоящему, и это будет работать!

...