Bonjour,

Je suis débutant en AS3, et suis en train de réaliser une application client en AS3 qui est destinée à recevoir un flux binaire envoyé par le serveur, quand à lui codé en c++. Les données envoyées par le serveur sont sous forme d'unsigned char.

Le code du client est donc le suivant (en version allégée) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
_socket.addEventListener(Event.CONNECT, connectHandler);
            _socket.addEventListener(Event.CLOSE, closeHandler);
            _socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorhandler);
            _socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
            _socket.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
private function dataHandler(e:ProgressEvent):void 
{
	//Reads header'size
	//var header_size:String = _socket.readBytes();
	trace(_socket.bytesAvailable);
 
	var bArray:ByteArray=new ByteArray();
 
	//read the bytes for the server into the bytearray
	_socket.readBytes(bArray,0,2); 
 
 
 
	var head_size:int =bArray.readUnsignedByte()+bArray.readUnsignedByte() * 255 ;
 
 
 
	trace ("Header's size : ", head_size);
	//Reads header
	bArray.position = 0;
 
	_socket.readBytes(bArray,0,head_size); 
 
//etc., etc.
}

Le problème vient du fait que le client n'attend pas d'avoir reçu suffisamment de données de la part du serveur pour lancer le dataHandler (il ne reçoit au final que 2 octets) : du coup, il bloque lors du deuxième readBytes et me sort un "End of file", justifié par le fait qu'il n'a effectivement plus rien à lire.

Quand suffisamment de données sont arrivées sur la socket, pas de problème : le deuxième readBytes les lit bien, mais généralement, seules 2 bytes sont arrivés sur le socket, et le deuxième readBytes bloque donc.

L'inconvénient est que je ne connais pas la longueur des chaînes de données entrantes : celle-ci est justement donnée par les 2 premiers bytes que je reçois...

Ma question est donc : est-il possible de forcer le ProgressEvent.SOCKET_DATA à lire les données entrantes sur la socket quand nécessaire (en gros, à chaque readBytes), et de le faire attendre si jamais il n'a pas reçu assez de données pour continuer ?

(ou si pas possible, comment modifier la structure de ce prog pour arriver à mes fins ?)

Merci d'avance !


Edit :

J'ai fini par résoudre le problème : plutôt que d'essayer de récupérer toutes les données en un bloc, je récupère juste ce qui arrive, et je le copie dans un buffer, et ce jusqu'à avoir reçu toutes les données nécessaires.

Si j'en ai reçu plus que nécessaire, je recopie ces données au début du buffer, et j'efface le reste.