gollunk
Messages postés22Date d'inscriptionmercredi 18 octobre 2006StatutMembreDernière intervention13 avril 2009
-
10 févr. 2009 à 22:32
gollunk
Messages postés22Date d'inscriptionmercredi 18 octobre 2006StatutMembreDernière intervention13 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:
gollunk
Messages postés22Date d'inscriptionmercredi 18 octobre 2006StatutMembreDernière intervention13 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.
pegase31
Messages postés6138Date d'inscriptiondimanche 21 décembre 2003StatutModérateurDernière intervention 4 septembre 201312 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
gollunk
Messages postés22Date d'inscriptionmercredi 18 octobre 2006StatutMembreDernière intervention13 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 ;)
pegase31
Messages postés6138Date d'inscriptiondimanche 21 décembre 2003StatutModérateurDernière intervention 4 septembre 201312 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'
Vous n’avez pas trouvé la réponse que vous recherchez ?
gollunk
Messages postés22Date d'inscriptionmercredi 18 octobre 2006StatutMembreDernière intervention13 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);
}
gollunk
Messages postés22Date d'inscriptionmercredi 18 octobre 2006StatutMembreDernière intervention13 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);
}
gollunk
Messages postés22Date d'inscriptionmercredi 18 octobre 2006StatutMembreDernière intervention13 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);
}
}
gollunk
Messages postés22Date d'inscriptionmercredi 18 octobre 2006StatutMembreDernière intervention13 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;
}
};
pegase31
Messages postés6138Date d'inscriptiondimanche 21 décembre 2003StatutModérateurDernière intervention 4 septembre 201312 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
pegase31
Messages postés6138Date d'inscriptiondimanche 21 décembre 2003StatutModérateurDernière intervention 4 septembre 201312 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 !
gollunk
Messages postés22Date d'inscriptionmercredi 18 octobre 2006StatutMembreDernière intervention13 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é !