2010-09-28 4 views
0

J'essaie d'écrire un client de jeu très simple pour m'entraîner avec Actionscript 3 et le framework Flex.Mise en réseau Flex: Comment lire plusieurs objets AMF

J'ai quelques problèmes avec le code suivant:

private function readResponse():void { 
    var r:ByteArray = new ByteArray(); 
    readBytes(r); 
    while (r.bytesAvailable != 0) 
    { 
    try 
    { 
    var d:Object = r.readObject(); 
    protocol.execute(d); // do something with the object 
    } 
    catch (RangeError) 
    { 
    trace("Ouch, packet dismissed? Restlength:" + r.bytesAvailable); 
    } 
    } 
    } 

Il semble bien fonctionner dans le client la plupart du temps, mais parfois j'ai eu un comportement étrange qui ne devrait pas occure. Si je regarde dans la sortie de la console, il y a beaucoup de paquets "rejetés". Une fois que j'ai consigné le reste du paquet mis au rebut, cela ressemble à un paquet cassé et incomplet. Il commence au milieu d'une chaîne par exemple. Cela se produit souvent si les données sont envoyées rapidement à partir du serveur. Du côté serveur, chacun des paquets est envoyé en appelant la fonction client.send() associée.

Est-ce la mauvaise façon d'essayer de gérer plus d'un objet entrant? Est-ce que cela pourrait être un problème côté serveur, entraînant l'envoi de paquets malformés/incomplets?

Je serais très heureux si quelqu'un peut m'aider.

Petite mise à jour, peut-être que cela aide: J'ai enregistré la longueur des données envoyées sur le réseau. Le journal ressemble à ceci (serveur | client):
208 | 208
92 | 92
208 | 208 214 | 214 & Ouch, paquet rejeté? Restlength :: 212
148 | r.bytesDisponible: 388
27 | 388 & Ouch, paquet rejeté? Restlength :: 384 etc ...

Cela ressemble au serveur qui détruit des données et le client est en train de jouer avec cela. Que pourrais-je poster de plus pour obtenir de l'aide sur ce problème? Dois-je vider les données manuellement sur le serveur Python pour que les choses fonctionnent correctement? Je ne suis pas vraiment sûr de ce qui se passe. Je sais juste que cela arrive surtout si je reçois beaucoup de client.send() très très rapidement, comme il est tamponné et ensuite envoyer la taille de la mémoire tampon, de sorte qu'il coupe le paquet en un peu lisible pour le client (car évidemment il ne s'attend pas à ceci). Je suis vraiment coincé avec ce :(

PS. Le serveur est écrit en Python avec un

socket TCP tutoriel comme d'habitude et les discussions clients

Répondre

0

Si vous utilisez l'AMF, je ne comprends pas pourquoi vous lire des octets à partir d'un tableau binaire

Essayez d'utiliser RemoteObject, et un gestionnaire de réponse (et éventuellement aussi un gestionnaire d'erreur)

Il y a un exemple ici: http://pyamf.org/tutorials/actionscript/simple.html#actionscript (que je ne l'ai pas essayé comme je ne suis pas python savvy)

A part cela, rappelez-vous que les commandes sont le feu et oublient. La majeure partie des problèmes rencontrés lors du traitement du trafic côté serveur dans Flex est due à l'absence d'enregistrement des écouteurs d'événement, etc. appel du serveur.

Hope it helps

+0

J'utilise AMF parce que j'aimé la façon facile de sérialisation en python/désérialisation dans Flex. J'ai besoin d'une connexion persistante et d'envoyer des données dans les deux sens. Je pense que cet exemple concerne uniquement les requêtes de type http (peut-être est-ce également applicable aux sockets?)? – woosa

Questions connexes