Votre experience d'applications réseaux en Java ... [Java] - Java - Programmation
Marsh Posté le 07-01-2003 à 13:32:43
kfman a écrit : |
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 ?
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
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.
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.
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²
Marsh Posté le 07-01-2003 à 22:33:00
up
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 :
|
(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.
Marsh Posté le 10-01-2003 à 09:43:33
nraynaud a écrit : |
j'espère qu'il fait pas caca ailleurs, hein!
Marsh Posté le 10-01-2003 à 15:58:58
gfive a écrit : |
Je préfère répéter les bases, ça coute rien et ça sert toujours :-)
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...
Marsh Posté le 10-01-2003 à 17:13:27
C'est ma première appli réseau en Java. Be indulgent...
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.
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
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 : |
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 : |
Ca l'est.
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.
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!
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 ?
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)
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.
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
Marsh Posté le 11-01-2003 à 09:12:56
Si tu met ces bouquins aux chiottes, essaie d'attrapper une gastro, quoi...
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.
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!
Marsh Posté le 11-01-2003 à 22:43:04
Oula ça vire scato, reprenez vous.
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 :
|
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).
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.
Marsh Posté le 12-01-2003 à 16:10:36
kfman a écrit : NRaynaud:
|
lisons le manuel 10s (j'ai jamais utilisé ce truc) :
http://java.sun.com/j2se/1.4.1/doc [...] putStream)
Citation : |
http://java.sun.com/j2se/1.4.1/doc [...] putStream)
Citation : |
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?
Marsh Posté le 12-01-2003 à 17:12:56
Tain je verrais pas un éléphant dans un tunnel
NRaynaud:
Marsh Posté le 12-01-2003 à 18:01:41
kfman a écrit : Tain je verrais pas un éléphant dans un tunnel |
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.
Marsh Posté le 12-01-2003 à 21:32:18
NRaynaud:
G tout mis dans des classes comme ceci:
Code :
|
Un classe de statut est de cette forme:
Code :
|
Dans Communication, g tout remplacé par:
Code :
|
Tout marche. Mais est-ce bien celà qu'il fallait faire ?
Marsh Posté le 12-01-2003 à 22:32:16
kfman a écrit :
|
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.
Marsh Posté le 14-01-2003 à 00:10:57
on veut en profiter aussi svp
(meme si perso je pense avoir tout capté là, quand meme )
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