我试图理解你的问题。如果以下解释与您的不同,请忽略它。
这在协议缓冲方面有点低级。可能有第三方库可用于在 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);
}
}