私はあなたの質問を理解しようとしています。以下の説明があなたの説明と異なる場合は、無視してください。
これは、プロトコルのバッファリングに関しては少し低レベルです。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);
}
}