Я пытаюсь понять ваш вопрос. Если приведенное ниже объяснение отличается от вашего, просто проигнорируйте его.
Это немного низкий уровень буферизации протокола. Могут быть сторонние библиотеки, доступные для передачи json на as3 как таковые, вы можете использовать их (например: http://code.google.com/p/as3corelib и т. Д.)
Данные, которые вы получаете на стороне клиента, могут быть разделенными на части, или вы можете получить все сразу. Таким образом, чтобы отслеживать размер данных (объем данных, которые вы получаете), вам нужно знать размер данных, отправляемых сервером. Для этого мы обычно кодируем первые несколько байтов (обычно 4 байта) данных с размером полных данных. Это может измениться в зависимости от протокола, согласованного клиентом и сервером.
Данные = "<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);
}
}