【问题标题】:AS3 Upload speed testAS3上传速度测试
【发布时间】:2012-02-13 09:01:03
【问题描述】:


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

附:我不能使用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";
    ?>

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

UPD 2

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

【问题讨论】:

  • 你的代码在哪里?你应该用addEventListener设置一个事件监听器。
  • _loader = new URLLoader(); _loader.dataFormat = URLLoaderDataFormat.BINARY; _loader.addEventListener(Event.COMPLETE,uploadComplete); _loader.addEventListener(ProgressEvent.PROGRESS, uploadProgress ); 一切正常,只是没有调度事件......
  • 您是否尝试过禁用您的防病毒软件?见stackoverflow.com/questions/2930513/…
  • 杀毒无罪。 Event.COMPLETE 开火良好。
  • 你看我贴的链接了吗?因为 Event.COMPLETE 也触发得很好。只有进度事件没有。

标签: flash actionscript-3 upload urlloader speed-test


【解决方案1】:

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

_loader.addEventListener("ioError", ldrError);    

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

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

【讨论】:

  • 起初我使用URLLoader 而不是Loader 来处理二进制数据,而URLLoader 没有contentLoaderInfo 属性。最后,我得到了 IOError 处理程序,但它没有跟踪任何内容。因此,即使是uploadComplete 事件也会在完整数据上传后调度,但进度不会。如果很快第一次发布,我会放上我的整个代码。
【解决方案2】:

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

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

【讨论】:

  • 谢谢。我做了一个TimerEvent,但有一个问题。 bytesLoaded 返回 received 字节的数量,但我需要计算 sent 字节。
  • 回想起来,这显然是预期的行为。在这种情况下,我会说您将不得不超出 Flash 的范围。我不确定您的 PHP 脚本中发生了什么,但如果上传是真正的流式传输并在整个上传过程中保存到服务器(例如使用 FTP),那么在您的 TimerEvent 处理程序中,我会轮询第二个 PHP 脚本对正在流式传输的文件调用 filesize() 并将其返回给 Flash。
【解决方案3】:

也许我已经找到了,不要使用附带的下载模拟器,真实上传/下载就可以了!

【讨论】:

  • 好电话 =) 但即使没有结果。我认为问题在于我的 POST 请求被“稳定”发送到服务器,而不是分块发送,所以只有 Event.COMPLETE 正在调度。而已。我想我需要使用流之类的东西或其他速度计算方式。
  • errrm,这是关于 SOCKET_DATA =)。你在说什么下载模拟器?
【解决方案4】:

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

【讨论】:

  • 下载很好,速度快,几乎和speedtest.net的结果一样。计算每秒接收的字节数。那不是问题。
【解决方案5】:

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


你验证服务器端脚本没问题吗?

【讨论】:

  • 是的,没关系。 complete 事件触发得很好,但这不是我需要的。
  • 我仍然不相信你明白我在说什么。您是否跟踪了来自服务器的响应并验证数据是否正确?不要仅仅因为你有一个完整的事件就认为没有服务器端问题。
  • 我们正在讨论上传部分。下载测试运行良好,进展顺利,字节数被计算在内。但是 upload 部分不是。 ProgressEvent 正在计算传入字节,但我需要输出。是的,有一种方法可以在completeEvent 中获得像“delta Time/totalBytes”这样的上传速度,但我需要在上传过程中动态计算它。
  • 再一次,如果您验证了您上传的服务器响应,我仍然没有被出售。上传完成后,需要在 complete 事件中查看服务器响应。
  • 让我为你拼写出来。您在服务器上的上传脚本中有错误。
【解决方案6】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    相关资源
    最近更新 更多