Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3187 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°280963
kfman
Credo quia absurdum
Posté le 07-01-2003 à 11:58:20  profilanswer
 

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
mood
Publicité
Posté le 07-01-2003 à 11:58:20  profilanswer
 

n°281032
krosso
j'suis à la bourre
Posté le 07-01-2003 à 13:32:43  profilanswer
 

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 ?
 

n°281036
darklord
You're welcome
Posté le 07-01-2003 à 13:35:17  profilanswer
 

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
n°281063
kfman
Credo quia absurdum
Posté le 07-01-2003 à 14:10:29  profilanswer
 

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
n°281121
krosso
j'suis à la bourre
Posté le 07-01-2003 à 15:38:56  profilanswer
 

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.

n°281130
darklord
You're welcome
Posté le 07-01-2003 à 15:41:34  profilanswer
 

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
n°281422
_guigui_
Posté le 07-01-2003 à 19:21:36  profilanswer
 

tu as quoi comme Exception? :??:

n°281595
kfman
Credo quia absurdum
Posté le 07-01-2003 à 22:33:00  profilanswer
 

up


---------------
"Nous allons reformater les français" © Nicolas Sarkozy
n°281691
nraynaud
lol
Posté le 08-01-2003 à 01:59:40  profilanswer
 

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.

n°283393
gfive
Posté le 10-01-2003 à 09:43:33  profilanswer
 

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

mood
Publicité
Posté le 10-01-2003 à 09:43:33  profilanswer
 

n°283625
nraynaud
lol
Posté le 10-01-2003 à 15:58:58  profilanswer
 

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 :-)

n°283685
e_esprit
Posté le 10-01-2003 à 16:51:07  profilanswer
 

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:

n°283705
kfman
Credo quia absurdum
Posté le 10-01-2003 à 17:13:27  profilanswer
 

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


---------------
"Nous allons reformater les français" © Nicolas Sarkozy
n°283711
nraynaud
lol
Posté le 10-01-2003 à 17:18:31  profilanswer
 

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.

n°283712
kfman
Credo quia absurdum
Posté le 10-01-2003 à 17:18:34  profilanswer
 

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
n°283735
nraynaud
lol
Posté le 10-01-2003 à 17:50:18  profilanswer
 

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.
 

n°283753
kfman
Credo quia absurdum
Posté le 10-01-2003 à 18:15:59  profilanswer
 

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
n°283768
gfive
Posté le 10-01-2003 à 18:33:33  profilanswer
 

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

n°283831
R3g
fonctionnaire certifié ITIL
Posté le 10-01-2003 à 20:35:11  profilanswer
 

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 ?

n°283834
HappyHarry
Posté le 10-01-2003 à 20:42:08  profilanswer
 

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)

n°283836
nraynaud
lol
Posté le 10-01-2003 à 20:43:38  profilanswer
 

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.

n°283849
R3g
fonctionnaire certifié ITIL
Posté le 10-01-2003 à 21:02:32  profilanswer
 

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

n°283987
gfive
Posté le 11-01-2003 à 09:12:56  profilanswer
 

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

n°284123
nraynaud
lol
Posté le 11-01-2003 à 15:29:38  profilanswer
 

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.

n°284274
gfive
Posté le 11-01-2003 à 19:48:49  profilanswer
 

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!

n°284368
kfman
Credo quia absurdum
Posté le 11-01-2003 à 22:43:04  profilanswer
 

Oula ça vire scato, reprenez vous.


---------------
"Nous allons reformater les français" © Nicolas Sarkozy
n°284392
kfman
Credo quia absurdum
Posté le 11-01-2003 à 23:21:58  profilanswer
 

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
n°284563
kfman
Credo quia absurdum
Posté le 12-01-2003 à 13:08:08  profilanswer
 

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
n°284656
nraynaud
lol
Posté le 12-01-2003 à 16:10:36  profilanswer
 

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?

n°284689
kfman
Credo quia absurdum
Posté le 12-01-2003 à 17:12:56  profilanswer
 

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


---------------
"Nous allons reformater les français" © Nicolas Sarkozy
n°284712
nraynaud
lol
Posté le 12-01-2003 à 18:01:41  profilanswer
 

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.

n°284799
kfman
Credo quia absurdum
Posté le 12-01-2003 à 21:32:18  profilanswer
 

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
n°284818
nraynaud
lol
Posté le 12-01-2003 à 22:32:16  profilanswer
 

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.

n°285699
--greg--
Posté le 14-01-2003 à 00:10:57  profilanswer
 

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!
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
[Java,AWT] Rafraichissement d'un objet graphiqueLe "Java Car"
[java] probleme de popup avec dreamweaverUtiliser la molette de la souris avec java?
xml, dom, javacomment ajouter une ligne en fin de fichier avec java ??
recuperer la resolution d'un ecran en java !! HELP PLEASEComment faire pour activé le java ?
[Java] Détecter la présence du JRE de Suncacher ou iconifier une fentre dos par laquelle j'execute un prog java
Plus de sujets relatifs à : [Java] Votre experience d'applications réseaux en Java ...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR