Classe socket et fonction de réception

Résolu
gollunk Messages postés 22 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 13 avril 2009 - 10 févr. 2009 à 22:32
gollunk Messages postés 22 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 13 avril 2009 - 12 févr. 2009 à 13:00
Bonjour tout le monde,


Je me permet de poster ce sujet afin de demander de l'aide à plus
expérimenté que moi au sujet de la classe Socket car j'ai un
souci sur lequel je planche depuis un moment.


Mon but est de créé un petit chat avec la possibilité de diriger un
personnage dans un monde en 2D isométrique. Ceci implique l'envoi au
serveur de différentes données, à savoir:


-Une information permettant de prévenir tout les clients de l'arrivée d'un joueur et de pouvoir l'identifier par la suite.


-Des données "texte" pour communiquer avec les autres clients.


-Les données relatives à la position des joueurs et qui assure la gestion des mouvements.

Lors de l'envoi des données, j'utilise une sorte de trame que je
split ensuite dans un tableau et qui contient un type (LOGIN ou TEXTE).


A partir de ce type je lance une action spécifique dans la fonction de
réception des données ( pour TEXTE: afficher le texte et pour LOGIN:
enregistrer le login du joueur dans un tableau; je ne me suis pas
encore occupé de POSITION pour gérer les mouvements des joueurs).


J'en viens maintenant à mon problème qui est sans doute simple mais que je n'arrive pas à identifier:

La fonction de réception (voir socket.onData =
function(donnee:String)) se lance à chaque fois qu'une donnée est reçue
(car le trace(trame[0]) s'affiche correctement ) mais elle ne lance
qu'une seule fois une des conditions ( ici elle ne lance que case:
LOGIN mais si je n'envoie pas le login elle ne va lancer qu'une seule
fois le case:TEXTE ).

J'espère avoir été assez clair, demandez moi plus de précision si
vous en avez besoin, je vous remercie par avance de l'aide que vous
pourrez m'apporter



Code:
,

----

//Connexion au serveur

socket.connect("localhost", 1024);

socket.onConnect = connexion;

//Si la connexion est faite afficher un voyant vert:

function connexion(connecte){ if(connecte) _root.etat.gotoAndStop(2);}

//ENVOI DES DONNEES AU SERVEUR

//*****************************

//On prévient les clients de l'arrivée du joueur:

_root.socket.send("LOGIN|"+_root.login);

//Si on appuie sur le bouton ok on affiche le texte:

this.ok.onRelease = function()

{

   if(_root.boite2.text != "")

   {

      _root.socket.send("TEXTE|"+_root.login+" dit: "+_root.boite2.text);

      _root.boite2.text = "";

   }

}

//RECEPTION DES DONNES DU SERVEUR

//********************************

trame = new array();

//Lance la fonction "reception" des la reception de donnees:

socket.onData = function(donnee:String)

{

   trame = donnee.split("|");

   trace(trame[0]); //Ceci affiche bien le type de la trame en sortie

//Mais la condition suivante ne fonctionne qu'une fois:

   switch(trame[0])

   {

      case"LOGIN"://Ajout du joueur dans le tableau des personnes en ligne

      _root.enligneArray.push(donnee);

      _root.Area.text += trame[1]+" est en ligne \n";

      break;

      

      case"TEXTE":

      _root.Area.text += trame[1]+"\n";

      break;

   }

};

26 réponses

gollunk Messages postés 22 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 13 avril 2009
11 févr. 2009 à 20:24
Bon j'ai trouvé une solution mais je n'ai toujours pas trouvé la source du problème.
J'envoie des trames du type: "|LOGIN|"+_root.login afin de les spliter en 3 données:

trame[0], trame[1], trame[2]

Cela permet d'avoir tout ce qui est avant le type de la trame dans trame[0].

Je ne sais pas si c'est la meilleure solution mais ça marche.
3
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
10 févr. 2009 à 22:58
Bonsoir,

Moi la première chose qui me dérange dans ton code, c'est que tu n'attends pas que le serveur envoie la réponse pour toi même envoyer les données de login ...
Inclues déjà ton envoie dans la fonction "connexion" et ça devrait déjà aller mieux

Peg'
0
gollunk Messages postés 22 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 13 avril 2009
11 févr. 2009 à 12:30
Merci mais je ne vois pas en quoi cela peut arranger les choses. Ceci dit, mon code n'est vraiment pas propre, tout ça est fait rapidement et j'ai l'intention de coder le tout en objet par la suite. As tu une autres piste Pegase ? Merci ;)
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
11 févr. 2009 à 12:52
Ce que ça pourrait empêcher : le login de ton utilisateur ... ce qui aurait pour conséquence de ne pas permettre l'envoie et réception de donnée.
A part ça, rien de grave ;)

Peg'
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gollunk Messages postés 22 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 13 avril 2009
11 févr. 2009 à 12:58
Dans ce cas j'ai du mal saisir.. c'est bien ça dont tu parles ?


function connexion(connecte)
{
    if(connecte) _root.etat.gotoAndStop(2);
    //On prévient les clients de l'arrivée du joueur
    _root.socket.send('LOGIN|'+_root.login);
}

0
gollunk Messages postés 22 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 13 avril 2009
11 févr. 2009 à 13:06
Mais ça revient au même, c'est juste plus propre comme ça.
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
11 févr. 2009 à 13:36
Non, ça n'en reviens pas au même .. c'est comme si tu te présentais à quelqu'un au tél alors qu'il n'a toujours pas décroché ...

Tu dis "attend d'être connecté et à ce moment-là envioe le fait que tu sois tel personne" ...

Peg'
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
11 févr. 2009 à 13:39
Sans parler du fait que tu ne sais pas si la connexion à réussis ou pas ... Tu n'as jamais chargé de fichier sous flash ?

Peg'
0
gollunk Messages postés 22 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 13 avril 2009
11 févr. 2009 à 13:45
Ca je suis d'accord ( d'ailleurs je le redis mon code n'est pas propre) mais à part ça ceci revient au même:


//CONNEXION AU SERVEUR
socket.connect("localhost", 1024);
socket.onConnect = connexion;


function connexion(connecte)
{
 if(connecte) _root.etat.gotoAndStop(2);
 //On prévient les clients de l'arrivée du joueur
 _root.socket.send('LOGIN|'+_root.login);
}



-----------------------------------------------------------------------------------------------------------



Code:
,

----

//Connexion au serveur
socket.connect("localhost", 1024);
socket.onConnect = connexion;

//Si la connexion est faite afficher un voyant vert:
function connexion(connecte){ if(connecte) _root.etat.gotoAndStop(2);}

//ENVOI DES DONNEES AU SERVEUR
//*****************************

//On prévient les clients de l'arrivée du joueur:
_root.socket.send("LOGIN|"+_root.login);


-------------------------------------------------------------------------------------------------------

Toujours est il que ça ne change rien à mon problème.
0
gollunk Messages postés 22 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 13 avril 2009
11 févr. 2009 à 13:47
D'ailleurs c'est plûtôt ça:


//CONNEXION AU SERVEUR
socket.connect("localhost", 1024);
socket.onConnect = connexion;


function connexion(connecte)
{
    if(connecte)
    { 
        _root.etat.gotoAndStop(2);
        //On prévient les clients de l'arrivée du joueur
        _root.socket.send('LOGIN|'+_root.login);
    }
}

0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
11 févr. 2009 à 14:16
ça en revient au même actuellement parce que tu as un serveur socket local qui te répond instantanément ...

Pour en revenir à ton problème de base, rajoute un truc après tes cases (dans le switch), genre :
default : trace ("retour :", donnee);

Et tu verras ce qui te reviens.

Peg'
0
gollunk Messages postés 22 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 13 avril 2009
11 févr. 2009 à 15:42
C'est une piste. J'affiche bien le login lors du lancement de l'application et lorsque je tape un message c'est default qui est lancé... avec "TEXTE" comme type de trame. Mais ça je le savais déjà avec le   trace(trame[0])


//RECEPTION DES DONNES DU SERVEUR
_root.socket.onData = function(donnee:String) 
{
 trame = donnee.split("|");
 trace(trame[0]);


 switch(trame[0])
 {
  case 'LOGIN'://Ajout du joueur dans le tableau des personnes en ligne
  _root.enligneArray.push(donnee); 
  _root.Area.text += trame[1]+" est en ligne \n";
  break;
  
  case 'TEXTE':
  _root.Area.text += trame[1]+"\n";
  break;
  
  default: 
  trace ("retour: "+donnee);
  break;
 }
};

0
gollunk Messages postés 22 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 13 avril 2009
11 févr. 2009 à 15:47
Un truc plutôt étrnage, je reçois en retour:

retour:



TEXTE|ddd



plutôt que:

retour: TEXTE|ddd
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
11 févr. 2009 à 15:55
alors c'est que ton systeme de renvoie te renvoie un caractère de retour chariot, ce qui fait que ton "case "est faux ... Voit ddu côté de ton server socket

Peg'
0
gollunk Messages postés 22 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 13 avril 2009
11 févr. 2009 à 15:58
Mais pourquoi ceci viendrait-il du serveur socket ?
0
gollunk Messages postés 22 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 13 avril 2009
11 févr. 2009 à 15:59
Et ceci devrait affecter la trame LOGIN aussi alors que ce n'est pas le cas.
0
gollunk Messages postés 22 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 13 avril 2009
11 févr. 2009 à 16:05
Je penses que ca c'est clair:

TYPE: LOGIN|pseudo
TYPE:


TEXTE|ddddd
0
gollunk Messages postés 22 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 13 avril 2009
11 févr. 2009 à 16:09
Et voila lorsque j'enleve l'envoi du login et que j'ecris un premier texte et ensuite un deuxieme:

TYPE: TEXTE|ffffffffffff
TYPE:


TEXTE|zzzzzzzzzzzzzzzzzzzz
[DEFAULT]
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
11 févr. 2009 à 16:25
Ça vient de ton serveur parce qu'à chaque fois que tu reçois une seconde instruction, il y a un double caractère de saut de ligne devant ton premier texte.
un "split" ne fait que séparer tes textes et comme tu les formates pour qu'il te renvoie un truc type (String)+"|"+(String), ben ça vient de là.
Tu recrées la variable "donnee" à chaque réception de data de ton serveur .. cherche en amont, et teste ce que je te dis, sinon ça ne sert à rien que j'essaye de t'aider !

Peg'
0
gollunk Messages postés 22 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 13 avril 2009
11 févr. 2009 à 16:37
J'utilise AquaServer mais les seules commandes qui existent sont LIST et QUIT, a part ça aucun fichier de configuration n'existe. Je ne vois pas la solution dont tu parles. Je tiens à te remercier pour ta patience, jusque là ça m'a beaucoup aidé !
0
Rejoignez-nous