[Java] Votre experience d'applications réseaux en Java ...

Votre experience d'applications réseaux en Java ... [Java] - Java - Programmation

Marsh Posté le 07-01-2003 à 11:58:20    

Bonjour,
 
J'ai écris un jeu de bataille navale en réseau.
Il marche très correctement dans l'ensemble.
 
Il subsiste toutefois un petit bug que j'arrive à reproduire assez facilement. Lors qu'un fort trafic réseau, l'application se bloque:
 
En effet, j'utilise une thread afin d'effectuer mes opérations de communication. Afin de synchroniser la communication (thread) et le controle du déroulement de la partie, je me sers de boucles d'attente avec flag.
 
Lors d'un fort trafic, la communication ne se fait plus entre client/serveur et l'appli se bloque.
 
Avez vous déjà eu ce problème ?
 
Pour le résoudre, j'ai penser à 2 solutions:
 
1. Envoyez de manière persistante les informations.
2. Faire passez en priorité le traffic de l'appli.
 
Qu'en pensez vous ?
 
Pour la 2, est-ce qu'il suffit d'utiliser la méthode setPriority de la classe Socket pour le faire ?
 
Merci d'avance.
A+.
 
 
 
 


---------------
"Nous allons reformater les français" © Nicolas Sarkozy
Reply

Marsh Posté le 07-01-2003 à 11:58:20   

Reply

Marsh Posté le 07-01-2003 à 13:32:43    

kfman a écrit :


...Lors d'un fort trafic, la communication ne se fait plus entre ...


 
C'est quoi un fort traffic, comment tu l'as mesuré ?
Fort traffic sur le PC ? Sur le réseau ?
 
Tu n'as pas de boucles qui ouvrent des sockets sans jamais les fermer ?
 

Reply

Marsh Posté le 07-01-2003 à 13:35:17    

je veux pas être méchant ni négatif mais ton implémentation doit etre plus que probablement merdique ...
 
Tout ca pour te dire que tu te poses probablement pas les bonnes questions et que la solution réside dans la façon dont tu as agencé tes objets et ton code proprement dit


Message édité par darklord le 07-01-2003 à 13:35:42

---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-01-2003 à 14:10:29    

En faisant des téléchargements ou bien des grosses pages web chargées... donc fort trafic réseau.
 
Krosso qu'entends-tu par boucle ?
 
J'ai fait des boucles qui me permette de synchroniser l'émission et la réception réseau selon si la thread réseau a fini son traitement (mise à jour des variables du jeu) et est près a recevoir la réponse à un nouvel envoi.
 
Mon implémentation:
 
Selon les variables du jeu, la classe de controle envoie les info réseau correspondantes, la thread réseau attend la réponse, l'analyse et met à jour les variables. Ca me parait assez simple et logique quant à la démarche.
 
--> Tout marche très bien sauf lors d'un pic de trafic.
 
 
 
 
 


---------------
"Nous allons reformater les français" © Nicolas Sarkozy
Reply

Marsh Posté le 07-01-2003 à 15:38:56    

C'est quoi les ports IP que tu utilises ?
T'as spécifié des timeouts à tes sockets ?
Qu'entends-tu par la comm ne se fait plus ?
Tu chopes des exceptions ?
 
Si ta question d'origine c'est "avez-vous entendu parler de pbm de comm réseau en java avec fort traffic".
La réponse est : "je ne crois pas, non", mais évidemment si t'as un truc sale qui bouffe 100% de la bande passante...
Faut voir sur ton équipement réseau: hub, switch... En général il y a des diodes qui indiquent le niveau de traffic >10% >50% collisions etc.
 
Mais à ta place je spouçonnerais plutôt mon code que celui de ton OS !
 
Le dernier pbm réseau que j'ai eu était le suivant:
Deux serveurs communiquaient ensemble.
D'un côté l'appli plantait. De l'autre, la socket restée dans un état intermédiaire appelé CLOSE_WAIT.
Et au bout de plusieurs jours sur une machine avec pas mal de traffic, le serveur n'avait plus de handlers libres pour de nouvelle socket. Je ne sais plus trop comment on nettoyait ça.
C'est tout de même assez particulier.

Reply

Marsh Posté le 07-01-2003 à 15:41:34    

Comme krosso je persiste à dire que tu dois regarder ton code de plus près. Ton application ne devrait pas envoyer tant de donnés que ça -> c'est pas normal²


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-01-2003 à 19:21:36    

tu as quoi comme Exception? :??:

Reply

Marsh Posté le 07-01-2003 à 22:33:00    

up


---------------
"Nous allons reformater les français" © Nicolas Sarkozy
Reply

Marsh Posté le 08-01-2003 à 01:59:40    

bon, je prends que le deuxième bout, c'est le plus emblématique.
 

kfman a écrit :


Code :
  1. while (true) {
  2.         
  3.     try {
  4.  naval.ready=true;
  5.  input = fluxEntree.readLine();
  6.  naval.ready=false;
  7.  System.out.println("\nnaval.status: "+naval.status+", naval.sync:"+naval.sync+"\n" );
  8.     }
  9.    
  10.     catch (IOException e) {
  11.  System.err.println("Lecture réseau impossible..." );
  12.     }
  13.    
  14.  
  15.    
  16.     // traitement des infos de l'autre ordinateur
  17.    
  18.     if (input.equals("SINK" )) { // Adversaire coulé
  19.  naval.enemycoule();
  20.     }
  21.    
  22.     switch (naval.status) {
  23.     case WAIT_FOR_BEGIN:
  24.  st = new StringTokenizer(input," " );
  25.  i=0;
  26.  System.out.println("WAIT_FOR_BEGIN" );
  27.  do {
  28.      infos[i]=st.nextToken();
  29.      System.out.println("infos["+i+"] = "+infos[i]);
  30.      i += 1;
  31.  } while (st.hasMoreTokens());
  32.  if (infos[0].equals("BEGIN" )) {
  33.     
  34.      othnam = infos[1]; //nom autre joueur  
  35.      othip = infos[2]; //ip autre joueur
  36.     
  37.      if (naval.nb_placer==10) { // Prêt à commencer ?
  38.   sendackb(); // envoi des infos du joueur
  39.   naval.disButton();
  40.   naval.player = YOU_PLAY; // au tour de l'autre joueur
  41.   naval.status = WAIT_FOR_SHOT; //attente coup du joueur
  42.   guita.append("Votre adversaire a la main, joueur "+othnam+" commence.\n" );
  43.   naval.statut_partie = 2;
  44.   naval.switchcasi();
  45.      }
  46.      else {
  47.   guita.append("Appel de votre adversaire.\n" );
  48.   sendnack('B'); // envoi nack type B
  49.      }
  50.  }
  51.  naval.sync=true;
  52.  System.out.println("naval.sync:"+naval.sync+"\n" );
  53.  break;
  54.     case WAIT_FOR_SHOT:
  55.  st = new StringTokenizer(input," " );
  56.  i=0;
  57.  System.out.println("WAIT_FOR_SHOT" );
  58.  do {
  59.      infos[i]=st.nextToken();
  60.      System.out.println("infos["+i+"] = "+infos[i]);
  61.      i += 1;
  62.  } while (st.hasMoreTokens());
  63.  if (infos[0].equals("SHOT" ))
  64.      {
  65.   int ch = Integer.parseInt(infos[1]); // recup coord H
  66.   int cv = Integer.parseInt(infos[2]); // recup coord V
  67.   if (naval.tabj1[ch][cv]==1) { // On teste s'il y a un bato au coord jouées
  68.       naval.tabj1[ch][cv]=2; // flag bato touché
  69.       naval.nb_placer -=1; // On décrémente le nb de batos
  70.       guita.append("Coup de "+othnam+" en "+(char)(65+cv)+" "+(ch+1)+" : touché !\n" );
  71.       sendack('S');
  72.       naval.repaint();
  73.   }
  74.   if (naval.tabj1[ch][cv]==0) { // On teste s'il y a un bato au coord jouées
  75.       naval.tabj1[ch][cv]=3; // flag bato loupé
  76.       guita.append("Coup de "+othnam+" en "+(char)(65+cv)+" "+(ch+1)+" : manqué !\n" );
  77.       sendnack('S');
  78.       naval.repaint();
  79.   }
  80.   naval.testcoule(); // Teste si tous les bateaux sont coulés
  81.   naval.player = I_PLAY;
  82.   naval.switchcasi();
  83.      }
  84.  naval.sync=true;
  85.  System.out.println("naval.sync:"+naval.sync+"\n" );
  86.  break;
  87.     case WAIT_FOR_ACKB:
  88.  st = new StringTokenizer(input," " );
  89.  i=0;
  90.  System.out.println("WAIT_FOR_ACKB" );
  91.  do {
  92.      infos[i]=st.nextToken();
  93.      System.out.println("infos["+i+"] = "+infos[i]);
  94.      i += 1;
  95.  } while (st.hasMoreTokens());
  96.  if (infos[0].equals("ACKB" )) {
  97.      othnam = infos[1];
  98.      othip = infos[2];
  99.      naval.ack=true;
  100.  }
  101.  else if(infos[0].equals("NACKB" )) {naval.ack=false;}
  102.  else {naval.ack=false;}
  103.  naval.sync=true;
  104.  System.out.println("naval.sync:"+naval.sync+"\n" );
  105.  break;
  106.     case WAIT_FOR_ACKS:
  107.  st = new StringTokenizer(input," " );
  108.  i=0;
  109.  System.out.println("WAIT_FOR_ACKS" );
  110.  do {
  111.      infos[i]=st.nextToken();
  112.      System.out.println("infos["+i+"] = "+infos[i]);
  113.      i += 1;
  114.  } while (st.hasMoreTokens());
  115.  if (infos[0].equals("ACKS" )) {naval.ack=true;}
  116.  if (infos[0].equals("NACKS" )) {naval.ack=false;}
  117.  naval.sync=true;
  118.  System.out.println("naval.sync:"+naval.sync+"\n" );
  119.  break;
  120.     }
  121. }
  122.    
  123.     }
  124.    
  125. }


 


 
(Bouge pas, je vérifie que le topic est bien java ... ah oui ...)
 
J'ai pas lu mais déjà une méthode de plus de 10 lignes en objet ça me fait peur, mais si en plus elle repose sur un switch-case géant ... m'étonne pas que tu ais des pb, commence déjà par la tronçonner et à déléguer des responsabilités à des objets.
 
du style je vois (tel Irma) "switch (naval.status)" que ça sent très fort l'automate => y'a un pattern pour ça (qui s'appelle justement State et qu'est tout con).
 
un bout du style : "while (st.hasMoreTokens());" => st.consumeAllRemainingTokens(). C'est pas à toi de modifier son état interne mais à lui (enfin, je soppose que st est un tokeniser).
 
encapsule ta partie réseau : un "serialiser" en entrée de réseau qui te transformera tes objets en chaines et une "factory" en sortie de réseau qui te créera des objets à partir de tes chaines de caractère.
 
Tes trucs en majuscules ressemblent fortement à des constantes entières qui représentent des types énumérés => des classes avec Singleton, ça va te virer des if et des comparaisons.
 
ton try ... catch a un pb, si tu a une erreur réseau, ta variable  
naval.ready ne va pas revenir à false, utilise une clause finaly (j'ai un doute sur le nom, je commence à mélanger tous les langages).
 
La convention de nommage de java est de systématiquement utiliser des mots entiers (éventuellement super-longs, c'est pas grave), elle est largement uniforme dans le monde.
 
 
J'ai pas effleuré le fond du problème car j'arrive pas à y voir clair.
 
Je viens de relire ton post, je precris tout Martin avec ça, grands maux grands remèdes : http://www.objectmentor.com/resour [...] .%20Martin
4 pages à lire à chaque caca dans tes toilettes.
 
Je te mettrais bien Meyer avec mais le bouquin coûte 400 balles : "Conception et programmation objet" Bertrand Meyer chez Eyrolles. Ca devrait déjà raisonablement t'occuper, 1154 pages, en virant glossaire, index et bibliographie.
 
Si tu veux, je veux bien passer du temps en privé (ICQ, Aim, IRC) pour t'expliquer le vocabulaire éventuellement abscond que j'ai utilisé ou t'aider à modifier ton code.

Reply

Marsh Posté le 10-01-2003 à 09:43:33    

nraynaud a écrit :


Je viens de relire ton post, je precris tout Martin avec ça, grands maux grands remèdes : http://www.objectmentor.com/resour [...] .%20Martin
4 pages à lire à chaque caca dans tes toilettes.


 
j'espère qu'il fait pas caca ailleurs, hein! :D

Reply

Marsh Posté le 10-01-2003 à 09:43:33   

Reply

Marsh Posté le 10-01-2003 à 15:58:58    

gfive a écrit :


 
j'espère qu'il fait pas caca ailleurs, hein! :D


 
Je préfère répéter les bases, ça coute rien et ça sert toujours :-)

Reply

Marsh Posté le 10-01-2003 à 16:51:07    

Franchement, vu l'application et le faible besoin de bande passante reseau, a ta place j'aurais utilisé RMI...
 
Ca aurait été vachement plus naturel a developper... :sarcastic:

Reply

Marsh Posté le 10-01-2003 à 17:13:27    

C'est ma première appli réseau en Java. Be indulgent...


---------------
"Nous allons reformater les français" © Nicolas Sarkozy
Reply

Marsh Posté le 10-01-2003 à 17:18:31    

kfman a écrit :

C'est ma première appli réseau en Java. Be indulgent...


 
C'est bien pour ça que je suis prêt à t'aider, d'un autre côté, je vois des problèmes de conception objets (qui est largement plus compliquée à apprendre qu'un langage assez dépouillé), les problèmes spécifiques à java, je m'en fout un peu.

Reply

Marsh Posté le 10-01-2003 à 17:18:34    

n_raynaud: pour la sérialisation, j'utilise ObjectInputStream et ObjectOutputStream ?
 
Pour le State:
g regardé la doc, mais utiliser les états revient au même que d'utiliser état=constante ?
 
Je regarde les Singleton/Monostate, ça a l'air assez interessant :)
 
En ce qui concerne les toilettes, c'est fou comme dans ces moments on prends plaisir à étudier son boukin Java :lol:


---------------
"Nous allons reformater les français" © Nicolas Sarkozy
Reply

Marsh Posté le 10-01-2003 à 17:50:18    

kfman a écrit :

n_raynaud: pour la sérialisation, j'utilise ObjectInputStream et ObjectOutputStream ?


D'après la doc, ça a l'air pas mal, mais tu n'auras plus de contrôle sur l'encode comme tu le faisais avant.

Citation :


Pour le State:
g regardé la doc, mais utiliser les états revient au même que d'utiliser état=constante ?


 
non, justement, le principe est de remplacer un paquet de if, de comparaisons et de switch par la liaison retardée du langage.
par exemple, tu auras une classe abstraite NavalStatus avec une méthode play(). Une sous-classe par état : WaitForBegin WaitForShot etc. Dans la méthode play() de chaque étape, tu mets  le code case correspondand. et tu remplace le switch par monEtat.play(). Les classes d'état seront instanciées en sortie de réseau directement par ta "factory" (qui sera, par ex. ton ObjectInputStream). Je te conseille de mettre tous tes états dans le même package et de ne pas l'importer (hormis dans ta factory), ça évitera de polluer ton espace de nom avec des nom à la con.
 

Citation :


Je regarde les Singleton/Monostate, ça a l'air assez interessant :)


Ca l'est.
 

Reply

Marsh Posté le 10-01-2003 à 18:15:59    

Pour les flux Objet, ça reviendra a peu près au même d'utiliser la méthode writeChars(String str), qui pe permet d'envoyer un String, ce qui est assez souple ?
 
Peux-tu m'expliciter plus en détail ceci stp:
 
 
non, justement, le principe est de remplacer un paquet de if, de comparaisons et de switch par la liaison retardée du langage.  
par exemple, tu auras une classe abstraite NavalStatus avec une méthode play(). Une sous-classe par état : WaitForBegin WaitForShot etc. Dans la méthode play() de chaque étape, tu mets  le code case correspondand. et tu remplace le switch par monEtat.play(). Les classes d'état seront instanciées en sortie de réseau directement par ta "factory" (qui sera, par ex. ton ObjectInputStream). Je te conseille de mettre tous tes états dans le même package et de ne pas l'importer (hormis dans ta factory), ça évitera de polluer ton espace de nom avec des nom à la con.

 
Ca va un peu vite pour moi. MP si tu le désire.


---------------
"Nous allons reformater les français" © Nicolas Sarkozy
Reply

Marsh Posté le 10-01-2003 à 18:33:33    

hop, relais!!  
 
En gros, tu te fais une classe abstraite  
 
MessageBatailleNavale, qui a (au moins) ces deux méthodes  
 
abstract execute(ClientBataileNavale)
abstract toString(); (ou toByteArray, enfin, toUnMachinQuiPasseraParLeRéseau)
 
, par exemple. Ensuite, tu définit ton protocole, et pour chaque message, tu crées une sous-classe de MessageBatailleNavale, avec la bonne implémentation de la méthode execute, c'est à dire le code à exécuter quand le message est reçu
 
A côté de ça, tu te fait une classe MessageBatailleNavaleFactory, qui a une méthode :
 
MessageBatailleNavale getMessage(String s) (ou byte[] ou UnMachinQuiPasseraParLeRéseau) : cette méthode prend en argument ce qui est passé par le réseau, et instancie la bonne sous-classe de MessageBatailleNavale...
 
Dans le client, tu n'as plus qu'à faire :  
 
UnMachinQuiPassePatLeReseau machin = socket.read() (enfin, tu lis un truc sur ta socket, quoi)
 
MessageBatailleNavale m = MessageBatailleNavaleFactory.getMessage(machin)
m.execute(this);
 
Du coup,  
1 - Tu sépares le mécanisme purement réseau, du comportement de ton client,
2 - Si tu veux ajouter des messages à ton protocole, tu ne modifies pas la partie réception de ton client.
 
Bon, c'est expliqué à la va-vite, là, mais globalement, c'est un peu ça! :D

Reply

Marsh Posté le 10-01-2003 à 20:35:11    

Je prends la balle au bond ; je suis justement à la recherche d'ouvrages papier ou non, d'un volume et d'un prix raisonnable, sur les design patterns et les "best practices" de programmation objet en général et java en particulier. Des suggestions ?

Reply

Marsh Posté le 10-01-2003 à 20:42:08    

R3g a écrit :

Je prends la balle au bond ; je suis justement à la recherche d'ouvrages papier ou non, d'un volume et d'un prix raisonnable, sur les design patterns et les "best practices" de programmation objet en général et java en particulier. Des suggestions ?


 
http://www.eyrolles.com/php.inform [...] ff05c86a07
 
?
 
(je sais pas ce que ca vaut)

Reply

Marsh Posté le 10-01-2003 à 20:43:38    

R3g a écrit :

Je prends la balle au bond ; je suis justement à la recherche d'ouvrages papier ou non, d'un volume et d'un prix raisonnable, sur les design patterns et les "best practices" de programmation objet en général et java en particulier. Des suggestions ?


"Design Patterns" Gamma, Helm, Johnson, Vlissides, édition Vuibert
 
et ... bouge, pas je vais le chercher dans mes chiottes ....
"Uml et les Desing Patterns" Craig Larman édition CampusPress.
 
Robert C. Martin :  
http://www.objectmentor.com/resour [...] .%20Martin
 
bon j'arrête, t'en a déjà pour au moins un mois.

Reply

Marsh Posté le 10-01-2003 à 21:02:32    

Merci beaucoup, je vais regarder tout ça. Heureusement, j'ai de la place dans les chiottes  :)

Reply

Marsh Posté le 11-01-2003 à 09:12:56    

Si tu met ces bouquins aux chiottes, essaie d'attrapper une gastro, quoi...

Reply

Marsh Posté le 11-01-2003 à 15:29:38    

gfive a écrit :

Si tu met ces bouquins aux chiottes, essaie d'attrapper une gastro, quoi...


Tu sais, rien que de les ouvrir, ça facilite le fait de rester ... c'est hyper chiant un bouquin d'info.

Reply

Marsh Posté le 11-01-2003 à 19:48:49    

ouais, je sais, mais bon, c'est quand même plus cher que les dragées fucca!
 
'tain, c'est n'importe quoi, ce thread scato!

Reply

Marsh Posté le 11-01-2003 à 22:43:04    

Oula ça vire scato, reprenez vous.


---------------
"Nous allons reformater les français" © Nicolas Sarkozy
Reply

Marsh Posté le 11-01-2003 à 23:21:58    

NRaynaud:
 
En utilisant ObjectInputStream et Input..., on dirait que mes flux E/S ne veulent pas se créer, j'ai fait ce code:
 

Code :
  1. try {
  2.  System.out.println("Serveur en écoute au port : "+param.n_port);
  3.  socksrv = new ServerSocket(param.n_port);
  4.  socket = socksrv.accept();
  5.  System.out.println("Le Client est connecté..." );
  6.  fluxEntree = new ObjectInputStream(socket.getInputStream());
  7.  fluxSortie = new ObjectOutputStream(socket.getOutputStream());
  8.  System.out.println("Flux E/S acquis" );
  9.     }
  10.    
  11.     catch (IOException e) {
  12.  System.err.println("Démarrage du serveur impossible..." );
  13.  endcomm();
  14.  System.exit(1);
  15.     }


 
Le message "Flux E/S acquis" n'apparait pas bien que le client et le serveur se connecte, ce qui me laisse d'ailleurs assez perplexe et me fait un beau NullPointerException dans la suite du programme, vu qu'il n'arrive pas à trouver le stream pour envoyer les données.
 
J'ai implémenter l'interface Serializable, j'utilise le readObject et writeObject, et tout se compile bien (sic).
 


---------------
"Nous allons reformater les français" © Nicolas Sarkozy
Reply

Marsh Posté le 12-01-2003 à 13:08:08    

J'ai refait des tests, regardé des exemples sur le net et relu la doc.
C'est bien les flux qui ne se crée pas, je me demande bien pkoi ?
 
Si je remet kom avant (flux texte) ça marche au poil !!!
 
J'en appelle à vos suggestions...
Merci d'avance.


Message édité par kfman le 12-01-2003 à 13:09:25

---------------
"Nous allons reformater les français" © Nicolas Sarkozy
Reply

Marsh Posté le 12-01-2003 à 16:10:36    

kfman a écrit :

NRaynaud:
 
En utilisant ObjectInputStream et Input..., on dirait que mes flux E/S ne veulent pas se créer, j'ai fait ce code:
 

Code :
  1. try {
  2.  System.out.println("Serveur en écoute au port : "+param.n_port);
  3.  socksrv = new ServerSocket(param.n_port);
  4.  socket = socksrv.accept();
  5.  System.out.println("Le Client est connecté..." );
  6.  fluxEntree = new ObjectInputStream(socket.getInputStream());
  7.  fluxSortie = new ObjectOutputStream(socket.getOutputStream());
  8.  System.out.println("Flux E/S acquis" );
  9.     }
  10.    
  11.     catch (IOException e) {
  12.  System.err.println("Démarrage du serveur impossible..." );
  13.  endcomm();
  14.  System.exit(1);
  15.     }


 
Le message "Flux E/S acquis" n'apparait pas bien que le client et le serveur se connecte, ce qui me laisse d'ailleurs assez perplexe et me fait un beau NullPointerException dans la suite du programme, vu qu'il n'arrive pas à trouver le stream pour envoyer les données.
 
J'ai implémenter l'interface Serializable, j'utilise le readObject et writeObject, et tout se compile bien (sic).
 
 


 
 
lisons le manuel 10s (j'ai jamais utilisé ce truc) :
http://java.sun.com/j2se/1.4.1/doc [...] putStream)

Citation :


A serialization stream header is read from the stream and verified. This constructor will block until the corresponding ObjectOutputStream has written and flushed the header.


 
http://java.sun.com/j2se/1.4.1/doc [...] putStream)

Citation :


This constructor writes the serialization stream header to the underlying stream; callers may wish to flush the stream immediately to ensure that constructors for receiving ObjectInputStreams will not block when reading the header.


 
T'est sûr que ça répond par du ObjectMachinStream derrière ? dans  l'ordre inverse ?
il faut que tu ais :
noeud 1 : ObjectInputStream(socket.getInputStream());
noeud2 : ObjectOutputStream(socket.getOutputStream());
noeud1 : ObjectOutputStream(socket.getOutputStream());
noeud2 : ObjectInputStream(socket.getInputStream());
 
T'es sûr que t'as ça ?
T'est sûr que ton accept ne t'a pas renvoyé un null?

Reply

Marsh Posté le 12-01-2003 à 17:12:56    

Tain je verrais pas un éléphant dans un tunnel :ouch:
 
NRaynaud: :love:


---------------
"Nous allons reformater les français" © Nicolas Sarkozy
Reply

Marsh Posté le 12-01-2003 à 18:01:41    

kfman a écrit :

Tain je verrais pas un éléphant dans un tunnel :ouch:
 
NRaynaud: :love:


 
On me dit dans mon oreillette qu'il suffit de lire les docs. En fait j'ai jamais entendu perler de ces classes avant ce topic et ça fait un mois que j'ai pas fait de java conclusion : lisez les docs.

Reply

Marsh Posté le 12-01-2003 à 21:32:18    

NRaynaud:
 
G tout mis dans des classes comme ceci:
 

Code :
  1. import java.util.*;
  2. abstract class MessageBatailleNavale {
  3.    
  4.     static void execute(String s, Communication com, Naval_gui naval) {
  5. String[] data = new String[3];
  6. StringTokenizer st = new StringTokenizer(s," " );
  7. int i=0;
  8. while (st.hasMoreTokens()) { // On récupère les autres champs, le cas échéant.  
  9.     data[i]=st.nextToken();
  10.     i += 1;
  11. }
  12. System.out.println("Type: "+ data[0]);
  13. if (data[0].equals("BEGIN" )) {
  14.     WaitForBegin.execute(data,com,naval);
  15. }
  16. if (data[0].equals("SHOT" )) {
  17.     WaitForShot.execute(data,com,naval);
  18. }
  19. if (data[0].equals("ACKB" )||data[0].equals("NACKB" )) {
  20.     WaitForAckb.execute(data,com,naval);
  21. }
  22. if (data[0].equals("ACKS" )||data[0].equals("NACKS" )) {
  23.     WaitForAcks.execute(data,com,naval);
  24. }
  25.     }
  26. }


 
Un classe de statut est de cette forme:  
 

Code :
  1. class WaitForBegin extends MessageBatailleNavale {
  2.     static void execute (String[] data, Communication com, Naval_gui naval) {
  3. com.othnam = data[1]; //nom autre joueur  
  4. com.othip = data[2]; //ip autre joueur
  5. if (naval.nb_placer==10) { // Prêt à commencer ?
  6.     naval.disButton();
  7.     naval.edit.append("Votre adversaire a la main, joueur "+com.othnam+" commence.\n" );
  8.     naval.statut_partie = 2;
  9.     com.sendackb();
  10.     com.player = com.YOU_PLAY; // au tour de l'autre joueur
  11.     com.status = com.WAIT_FOR_SHOT; //attente coup du joueur
  12.     naval.switchcasi();
  13.    
  14. }
  15. else {
  16.     naval.edit.append("Appel de votre adversaire.\n" );
  17.     com.sendnack('B'); // envoi nack type B
  18. }
  19. naval.sync=true;
  20. System.out.println("naval.sync:"+naval.sync+"\n" );
  21.     }
  22. }


 
Dans Communication, g tout remplacé par:
 

Code :
  1. MessageBatailleNavale.execute(input,this,naval);


 
Tout marche. Mais est-ce bien celà qu'il fallait faire ?


---------------
"Nous allons reformater les français" © Nicolas Sarkozy
Reply

Marsh Posté le 12-01-2003 à 22:32:16    

kfman a écrit :


Code :
  1. <snip>
  2. if (data[0].equals("BEGIN" )) {
  3.     WaitForBegin.execute(data,com,naval);
  4. }
  5. if (data[0].equals("SHOT" )) {
  6.     WaitForShot.execute(data,com,naval);
  7. }
  8. if (data[0].equals("ACKB" )||data[0].equals("NACKB" )) {
  9.     WaitForAckb.execute(data,com,naval);
  10. }
  11. if (data[0].equals("ACKS" )||data[0].equals("NACKS" )) {
  12.     WaitForAcks.execute(data,com,naval);
  13. }
  14.     }
  15. }


 
Tout marche. Mais est-ce bien celà qu'il fallait faire ?
 


 
Non, pas du tout, files moi-tout le code sur mon mail (nraynaud dans le domaine nraynaud.com) et je réécris en expliquant car là c'est trop difficile à rattraper par la discution.

Reply

Marsh Posté le 14-01-2003 à 00:10:57    

on veut en profiter aussi svp :o
 
(meme si perso je pense avoir tout capté là, quand meme :D)


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed