3


AS3でスピードテストを行っています。そして、そのような問題が発生しました。
私はURLLoader( )自分のテストで使用しており、ダウンロードテストでは非常にうまく機能しますが、アップロードテストでは問題が発生しました。いくつかのバイナリデータをphp-scriptに送信し、現在の速度を計算progress_eventするためにを確認していますが、イベントはディスパッチされておらず、ファイル全体が送信されたときにのみ表示されます。では、バイト送信プロセスによって速度を決定するにはどうすればよいですか?bytesLoadedcomplete_event

PS使用できませんfileReference。テストを1つずつ使用していて、ユーザーに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

だから、すべての答え、コメントを読み、何時間もグーグルした後、私はおそらく解決策を手に入れましたが、それは最初に望んでいたものとは異なる方法で作られています。とにかくTYVMすべて、私はすぐに解決策を投稿します。

4

6 に答える 6

1

これを追加してみて、エラーが発生するかどうかを確認してください。それが問題かもしれません。

_loader.addEventListener("ioError", ldrError);    

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

php スクリプトに問題がある可能性があります。

于 2012-02-13T10:11:22.460 に答える
1

ProgressEventの起動に頼る代わりに、 ENTER_FRAMEリスナーを追加して、_loader インスタンスから bytesLoaded をプルしてみてください。ENTER_FRAME が機能する場合、ENTER_FRAMEの処理負荷を軽減するために、短い遅延で繰り返すTimerEventに置き換えることができます。

現在これをテストすることはできませんが、ProgressEvent が発生していないか、ストリーミング自体に問題があるかどうかを少なくとも知らせる必要があります。

于 2012-02-24T12:04:55.780 に答える
0

ProgressEventsが起動しない理由は、アップロード部分ではなく、リクエストのダウンロード部分(つまり、サーバーからの応答)に関係しているためです。サーバーの応答がかなり大きい場合(たとえば、大きな画像の形式で)、ProgressEventsが表示されますが、スクリプトは少量のテキストを返すだけなので、アップロードが完了した後、そこに到達する前に非常に迅速に完了します。 URLLoaderがProgressEventをディスパッチするときはいつでもです。

前述のように、FileReferenceクラスを使用することは、進行中のアップロードをFlashがイントロスペクトできる唯一の方法ですが、もちろん、いくつかの制限があります。

私のアドバイスは、既知のサイズのPOSTペイロードを使用してURLLoaderを設定しnew Date().getTime()、loadメソッドを呼び出す直前に保存することです。COMPLETEイベントが返されたら、現在の時刻を再度取得し、比較して、ペイロードのサイズに基づいた平均アップロードレートを取得します。ダウンロード部分も必然的に組み込まれるため、これは概算であり、計算された速度は実際よりもわずかに遅くなることに注意してください。

もう1つの回避策は、サーバー側でアップロードの実行の進行状況と速度を監視し、データがすべて転送されるまで、Flashに別のアップロードの進行状況スクリプトを定期的に呼び出させることでこれを報告することです。

于 2013-03-05T16:33:06.270 に答える
0

ダウンロード方向でどれくらい速くテストできたか、また Windows システムで問題が発生したかどうかに興味がありましたか? さまざまなブラウザーを使用している Windows システムで、ダウンロードが最大 25Mbps に達するような何らかのボトルネックにぶつかっているようです。Mac OS および Linux システムでは、回線速度が ~100Mbps に達しています。

于 2012-02-24T16:42:58.990 に答える
0

多分私はそれを見つけました、含まれているダウンロードシミュレーターを使用せず、実際にアップロード/ダウンロードしてください。

于 2012-02-13T11:20:53.873 に答える
0

サーバースクリプトにエラーがあるように思えます。これは、progressEvent をトリガーしない迅速な応答を返します。
この場合、XX 行で何とか何とか何とかというようなエラー コードが返される可能性があります。
このようなケースでは、クライアントが応答を取得したため、complete イベントが発生します。(200OK)


サーバー側のスクリプトが正常であることを確認しましたか?

于 2012-02-24T20:22:33.917 に答える