1

ロングポーリングに興味があります - as3 で URLLoader を介して実装できますか? 更新を定期的にチェックし、それらをクライアントにプッシュする必要があるphpバックエンドがあります。私はソケットを使いたくありません(最近のプロジェクトではウイルス対策とファイアウォールにたくさんの問題がありました)。

だから基本的に:

  1. クライアントは URLLoader 経由で post\get リクエストを php スクリプトに送信します。
  2. php は更新をチェックし、返送がある場合は返送し、そうでない場合は再度チェックするよりも 500 ミリ秒スリープします。
  3. クライアントは更新を受け取り、手順 1 から繰り返します。

主な質問は次のとおりだと思います-URLLoaderまたはURLRequestはタイムアウト時にこの接続を閉じますか、更新を待つために何らかの方法で構成できますか?

4

1 に答える 1

2

コメントありがとうございます。URLStream が私が望むことを実行できるかどうかを確認するテスト アプリを作成しました。したがって、PHP コード:

<?php
header('Content-Type: application/json; charset=utf-8');

$sleepTime=1*1000000; //every second

$endTime=time()+60*1; //after one minute

while(time()<$endTime)
{
    usleep($sleepTime);
    pushRandom();
}
echo json_encode(array('time'=>time(), 'message'=>'Bye world!'));
flush();
ob_flush();

function pushRandom()
{
    echo json_encode(array('time'=>time(), 'number'=>  rand(1, 10000)));
    flush();
    ob_flush();
}
?>

機能 - 1 分間、1 秒ごとに JSON オブジェクトをエコーし​​ます。その後、Bye World が鳴り響き、ポーリングを終了します。

そして as3 コード:

package com.drabuna.as3longpoll
{
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.IOErrorEvent;
    import flash.events.ProgressEvent;
    import flash.net.URLRequest;
    import flash.net.URLStream;
    import flash.utils.ByteArray;

    public class LongPoll extends EventDispatcher
    {
        private var url:String;
        private var urlRequest:URLRequest;
        private var urlStream:URLStream;

        private var bytesRead:int=0;

        public function LongPoll(serverURL:String)
        {
            url=serverURL;
        }

        public function startPolling():void
        {
            urlRequest=new URLRequest(url);
            urlStream=new URLStream();
            urlStream.addEventListener(ProgressEvent.PROGRESS, onPollData);
            urlStream.addEventListener(Event.COMPLETE, onPollFinished);
            urlStream.addEventListener(IOErrorEvent.IO_ERROR, onPollError);
            urlStream.load(urlRequest);
        }

        public function endPolling():void
        {
            if(urlStream.connected)
            {
                urlStream.close();
            }
        }

        private function onPollData(e:ProgressEvent):void
        {
            if(urlStream.bytesAvailable>bytesRead)
            {
                var byteArray:ByteArray=new ByteArray();
                urlStream.readBytes(byteArray, bytesRead, urlStream.bytesAvailable-bytesRead);

                var tempString:String=byteArray.readUTFBytes(byteArray.bytesAvailable);

                var error:Boolean=false;
                try
                {
                    var jsonObject:Object=JSON.parse(tempString);

                }
                catch(e:Error)
                {
                    error=true;
                }

                if(!error)
                {
                    bytesRead=urlStream.bytesAvailable;
                    var evt:LongPollEvent=new LongPollEvent(LongPollEvent.POLL_DATA);
                    evt.data=jsonObject;
                    this.dispatchEvent(evt);    
                }
            }
        }

        private function onPollFinished(e:Event):void
        {
            var evt:LongPollEvent=new LongPollEvent(LongPollEvent.POLL_FINISHED);
            this.dispatchEvent(evt);
        }

        private function onPollError(e:IOErrorEvent):void
        {
            var evt:LongPollEvent=new LongPollEvent(LongPollEvent.POLL_ERROR);
            evt.data=e;
            this.dispatchEvent(evt);
        }

    }
}

ストリームを読み取り、それを as3 オブジェクトに解析する単純なクラス。すべてうまくいきます!)

于 2013-10-22T16:47:07.550 に答える