3


我正在对 AS3 进行速度测试。并遇到了这样的问题。
URLLoader( )在我的测试中使用,并且对于下载测试它工作得很好,但是对于上传测试我遇到了一些麻烦。我正在向我的 php-script 发送一些二进制数据,并检查progress_eventto getbytesLoaded以计算当前速度,但该事件没有调度,仅complete_event在发送整个文件时出现。那么如何通过字节发送过程来确定速度呢?

PS我不能使用fileReference,因为我正在一个一个地使用我的测试并且不能让用户点击filebrowse()对话框。

谢谢。

        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";
    ?>

是的,它很小,但我真的不需要数据,我需要检查它上传的速度。

更新 2

因此,在阅读了所有答案、评论和谷歌搜索数小时后,我可能得到了解决方案,但它的制作方式与我一开始所希望的不同。无论如何 TYVM 所有,我会尽快发布解决方案。

4

6 回答 6

1

不要依赖ProgressEvent触发,而是尝试添加一个ENTER_FRAME侦听器并从 _loader 实例中提取 bytesLoaded。如果 ENTER_FRAME 有效,那么您可以尝试在短时间内用重复的TimerEvent替换它,以减少 ENTER_FRAME 的处理负载。

我现在无法对此进行测试,但这至少应该让您知道这是否是 ProgressEvent 未触发或流本身的问题。

于 2012-02-24T12:04:55.780 回答
1

尝试添加它,看看是否有错误。这可能是问题所在。

_loader.addEventListener("ioError", ldrError);    

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

可能是你的 php 脚本有问题。

于 2012-02-13T10:11:22.460 回答
0

您的 ProgressEvents 没有触发的原因是因为它们与您的请求的下载部分(即来自服务器的响应)有关,而不是与上传部分有关。如果服务器响应相当大(例如,以大图像的形式),您肯定会看到 ProgressEvents,但由于您的脚本只返回少量文本,它会在上传完成后很快完成,然后再出现是 URLLoader 调度 ProgressEvent 的任何时间。

正如您所提到的,使用 FileReference 类是 Flash 可以对正在进行的上传进行自省的唯一方法,但当然它有许多限制。

我的建议是使用已知大小的 POST 有效负载设置您的 URLLoader,然后new Date().getTime()在调用 load 方法之前立即存储。返回 COMPLETE 事件后,再次获取当前时间,并根据负载大小进行比较以获取平均上传速率。请注意,这只是近似值,因为它不可避免地也包含下载​​部分,因此您计算的速度将略低于实际速度。

另一种解决方法是在服务器端监控上传的运行进度和速度,并通过让 Flash 定期调用单独的上传进度脚本来报告这一点,直到数据全部传输完毕。

于 2013-03-05T16:33:06.270 回答
0

也许我已经找到了,不要使用附带的下载模拟器,上传/下载真实,它会工作!

于 2012-02-13T11:20:53.873 回答
0

在我看来,服务器脚本中有错误。这将快速返回不会触发progressEvent的响应。
在这种情况下,可能会在第 XX 行返回类似于错误代码 blah blah blah 的内容。
像这样的案例会触发 complete 事件,因为客户端确实得到了响应。(200 确定)


您是否验证了服务器端脚本正常?

于 2012-02-24T20:22:33.917 回答
0

想知道您在下载方向上的测试速度有多快,以及您是否遇到了 Windows 系统的任何问题?我似乎在使用各种浏览器的 Windows 系统中遇到了某种瓶颈,我的下载最高可达 ~25Mbps。在 Mac OS 和 Linux 系统上,我达到了 ~100Mbps 的线速度。

于 2012-02-24T16:42:58.990 回答