Classe socket et fonction de réception

Résolu
Signaler
Messages postés
22
Date d'inscription
mercredi 18 octobre 2006
Statut
Membre
Dernière intervention
13 avril 2009
-
Messages postés
22
Date d'inscription
mercredi 18 octobre 2006
Statut
Membre
Dernière intervention
13 avril 2009
-
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

Messages postés
22
Date d'inscription
mercredi 18 octobre 2006
Statut
Membre
Dernière intervention
13 avril 2009

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.
Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
10
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'
Messages postés
22
Date d'inscription
mercredi 18 octobre 2006
Statut
Membre
Dernière intervention
13 avril 2009

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 ;)
Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
10
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'
Messages postés
22
Date d'inscription
mercredi 18 octobre 2006
Statut
Membre
Dernière intervention
13 avril 2009

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);
}

Messages postés
22
Date d'inscription
mercredi 18 octobre 2006
Statut
Membre
Dernière intervention
13 avril 2009

Mais ça revient au même, c'est juste plus propre comme ça.
Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
10
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'
Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
10
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'
Messages postés
22
Date d'inscription
mercredi 18 octobre 2006
Statut
Membre
Dernière intervention
13 avril 2009

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.
Messages postés
22
Date d'inscription
mercredi 18 octobre 2006
Statut
Membre
Dernière intervention
13 avril 2009

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);
    }
}

Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
10
ç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'
Messages postés
22
Date d'inscription
mercredi 18 octobre 2006
Statut
Membre
Dernière intervention
13 avril 2009

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;
 }
};

Messages postés
22
Date d'inscription
mercredi 18 octobre 2006
Statut
Membre
Dernière intervention
13 avril 2009

Un truc plutôt étrnage, je reçois en retour:

retour:



TEXTE|ddd



plutôt que:

retour: TEXTE|ddd
Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
10
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'
Messages postés
22
Date d'inscription
mercredi 18 octobre 2006
Statut
Membre
Dernière intervention
13 avril 2009

Mais pourquoi ceci viendrait-il du serveur socket ?
Messages postés
22
Date d'inscription
mercredi 18 octobre 2006
Statut
Membre
Dernière intervention
13 avril 2009

Et ceci devrait affecter la trame LOGIN aussi alors que ce n'est pas le cas.
Messages postés
22
Date d'inscription
mercredi 18 octobre 2006
Statut
Membre
Dernière intervention
13 avril 2009

Je penses que ca c'est clair:

TYPE: LOGIN|pseudo
TYPE:


TEXTE|ddddd
Messages postés
22
Date d'inscription
mercredi 18 octobre 2006
Statut
Membre
Dernière intervention
13 avril 2009

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]
Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
10
Ç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'
Messages postés
22
Date d'inscription
mercredi 18 octobre 2006
Statut
Membre
Dernière intervention
13 avril 2009

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é !