2

JSON オブジェクトを定期的に送信する URL への接続を開こうとしています。URLStream といくつかのイベント コールバックを使用する必要があることはわかっていますが、データのストリームがどのように「機能する」か、または操作の一般的な流れを知ることになると、わかりません。接続を開き、正しい要求ヘッダーを送信する方法を知っていると仮定します。まず、いくつかの関連コード:

stream = new URLStream();
stream.addEventListener(ProgressEvent.PROGRESS, dataReceived);
stream.load(request);

private function dataReceived(pe:ProgressEvent):void
{
    //now what?
}

サーバーが JSON オブジェクトを吐き出す場合、1 つの完全なオブジェクトの読み取りを停止して別の関数に渡すにはどうすればよいでしょうか? dataReceived はどのくらいの頻度で呼び出されますか? サーバーが何かを送信するとき、JSON の大きさを示して、停止するタイミングがわかりますか? インターネット上のさまざまなコード スニペットを読んだ後、これらがこの操作の主要なプレーヤーになると判断しました。

pe.bytesLoaded
stream.readUTFBytes(length:String)

およびおそらくpe.bytesTotal

併用の仕方がわからないみたいです。bytesTotal は、受信した完全な JSON オブジェクトの予想される合計サイズですか? 私はこれについてほとんど知らないので、何を尋ねたらよいか本当にわからないので、無知な方法で質問を投げかけているだけです. http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/net/URLStream.htmlを読んでいますが、コード例はコールバックのスケルトンであるため、役に立ちません。

質問が明確になったことを願っています。ありがとうございます。

編集: 単一の JSON エントリはキャリッジ リターンで終了します \r

4

1 に答える 1

1

私はあなたの質問を理解しようとしています。以下の説明があなたの説明と異なる場合は、無視してください。

これは、プロトコルのバッファリングに関しては少し低レベルです。as3 で json を転送するためにサードパーティのライブラリが利用できる場合があります。それらを使用できます (例: http://code.google.com/p/as3corelibなど) 。

クライアント エンドで受信するデータは、チャンク化されるか、一度に取得される場合があります。したがって、データ サイズ (受信するデータの量) を追跡するには、サーバーが送信しているデータのサイズを知る必要があります。これを行うには、通常、データの最初の数バイト (通常は 4 バイト) を完全なデータのサイズでコーディングします。これは、クライアントとサーバーの両方が同意したプロトコルに基づいて変更される場合があります。

Data = "<4 バイト >< 残りのデータ >"

したがって、サーバーが送信しているデータのサイズを取得したら、完全なデータを受信するまで、データを収集するために内部バッファーを保持する必要があります。

このアクション スクリプトを実行する方法を説明します。これはから取られました

http://code.google.com/p/cave/source/browse/trunk/cave/wave/org/cestum/cave/presenter/rpc/CaveSocket.as

ご理解の上、コメントさせていただきました…

               private function onResponse(e:ProgressEvent):void{
                    trace("Recieved Response");
                    //InputBuffer is socket buffer
                    if (inputBuffer.bytesAvailable == 0)
                            inputBuffer.clear();

                    //copy all bytes from socket buffer, to internal buffer - this way you avoid working on socket buffer internally
                    //and have more control on the pulling data your way. Because server keeps on appending data to socket buffer, 
                    //you may lose control
                    readBytes(inputBuffer, inputBuffer.length, bytesAvailable);

                    //AS3 is single threaded, we'll create a new event for our data 
                    //processing so that socket buffers its data from server seperately.
                    dispatchEvent(new Event("DataComplete"));
            }

            //DataComplete Event
            function onCompleteData(event:Event):void {
                    trace("Complete Data");
                    //We havent got the requires data size from server
                    if (requiredSize == -1) {
                            //Look for first four bytes - that has our data size.
                            if (inputBuffer.bytesAvailable < 4 ) {

                                    return;
                            }
                            var sizeBuffer:ByteArray = new ByteArray();
                            inputBuffer.readBytes(sizeBuffer,0 , 4);        
                            var ipStream1:CodedInputStream = CodedInputStream.newInstance(sizeBuffer);
                            requiredSize = ipStream1.readRawLittleEndian32();
                    }
                    if (requiredSize == -1) return;

                    trace( "Req: " + requiredSize + "   buffer_length: " + buffer.length  + "     bytes_Available: " + inputBuffer.bytesAvailable  + "     bytes_Position: " + inputBuffer.position);

                    //Now you know the size of data server is sending... just extract that amount of data from socket buffer to internal buffer.


                    if ((requiredSize - buffer.length) > inputBuffer.bytesAvailable) {
                            inputBuffer.readBytes(buffer,buffer.length , inputBuffer.bytesAvailable);
                            return;
                    } else {
                            inputBuffer.readBytes(buffer, buffer.length , (requiredSize - buffer.length));
                    }
                    trace("Before processing: " + buffer.length);

              ...Process your data here....


                    requiredSize = -1;
                    lastReadByte = -1;
                    buffer = new ByteArray();
                    if (inputBuffer.bytesAvailable > 0) {
                            onCompleteData(null);
                    }                       
            }
于 2010-06-27T05:41:14.567 に答える