Есть 2 подхода:
Если вы уверены, что ваш объект поместится в один пакет, вы можете сделать что-то вроде:
var fromServer:ByteArray = new ByteArray;
while( socket.bytesAvailable )
socket.readBytes( fromServer );
fromServer.position = 0;
var myObj:* = fromServer.readObject();
Если у вас есть возможность иметь несколькопакетные сообщения, тогда обычно используют для добавления в сообщение длину сообщения.Что-то вроде (псевдокод):
var fromServer:ByteArray = new ByteArray();
var msgLen:int = 0;
while ( socket.bytesAvailable > 0 )
{
// if we don't have a message length, read it from the stream
if ( msgLen == 0 )
msgLen = socket.readInt();
// if our message is too big for one push
var toRead:int = ( msgLen > socket.bytesAvailable ) ? socket.bytesAvailable : msgLen;
msgLen -= toRead; // msgLen will now be 0 if it's a full message
// read the number of bytes that we want.
// fromServer.length will be 0 if it's a new message, or if we're adding more
// to a previous message, it'll be appended to the end
socket.readBytes( fromServer, fromServer.length, toRead );
// if we still have some message to come, just break
if ( msgLen != 0 )
break;
// it's a full message, create your object, then clear fromServer
}
Если ваш сокет сможет читать таким образом, это будет означать, что несколько пакетных сообщений будут прочитаны правильно, а также тот факт, что вы не пропустите ни одного сообщения, где 2 маленькихсообщения отправляются почти одновременно (так как первое сообщение будет обрабатывать все как одно сообщение, пропуская второе)