salut, je develope un petit chat client serveur en java, dans ce chat le client dés qu'il se connecte il récupere la liste des utilisateurs connectés de puis le serveur et remplie une jlist avec la liste, le probleme c'est que le client se bloque apres qu'il consulte le serveur, voila le code client et serveur, et merci pour l'aide.
si vous avez des idées pour faire cela autrement, elles sont lesbienvenue.
code serveur:
Thread threadlistpseudo=new Thread() { public PrintWriter out=null; public BufferedReader in=null; public ServerSocket sEcoute=null; public Socket sService=null; public void run() { ////////repondre a la requete du client pour lui communiquer la liste des pseudo try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection(url); stm = con.createStatement(); sEcoute =new ServerSocket(3500); sService=sEcoute.accept(); out=new PrintWriter(sService.getOutputStream(),true); in=new BufferedReader(new InputStreamReader(sService.getInputStream())); String query=in.readLine(); rst=stm.executeQuery(query); while(rst.next()) { out.write(rst.getString(1)+ "\r\n"); out.flush(); } out.flush(); sEcoute.close(); }catch(Exception ex){System.out.println(ex.getMessage());} } }; threadlistpseudo.start();
code client:
public void windowOpened(java.awt.event.WindowEvent e) { ///////requete pour demander la liste des connectés depuis le serveur try { ///state='c' =>connecté String req1="select login from authentification where state='c'"; sClient =new Socket("localhost",3500); out=new PrintWriter(sClient.getOutputStream(),true); out.write(req1+ "\r\n"); out.flush(); in=new BufferedReader(new InputStreamReader(sClient.getInputStream())); String req=in.readLine(); DefaultListModel dlm=new DefaultListModel(); lpseudo.setModel(dlm); while(req!=null) { req=in.readLine(); lpseudo.setModel(dlm); dlm.addElement(req); lpseudo=new JList(dlm); } sClient.close(); } catch (Exception ex) {System.out.println(ex.getMessage()); }
Je n'ai pas regardé attentivement ton code par manque de temps :oops:
Mais je dirais qu'il ne bloque pas. Il fait ce que tu lui demandes, c'est à dire lire des lignes en boucle depuis un flux. Donc il lit toutes les lignes et lorsque tout est lu il lit la ligne suivante, c'est à dire celle qui va arriver (si elle arrive un jour ;) ); Donc ton client n'est pas bloqué mais en attente.
Pour obtenir ce que tu veux, tu dois tester la présence de quelque chose à lire dans le flux avant de lire.
Par exemple:
ça me donne pas la possibilité d'écrire in.available(), j'ai essayé avec in.readLine() != null , mais sans résultat.
Mais si...
null certainement pas puisque available retourne un entier.
available c'est une méthode de bas niveau. Tu l'as dans les Stream, pas dans les Reader qui sont des classes de plus haut niveau.
Faut adapter un peu ton code (je te rapelle que je ne l'avais pas lu en détail).
Donc quelque chose comme:
j'ai changé le code comme vous avez dit, mais cette fois ci, il remplie la jlist avec un seul enregistrement, avant il me ramene tous les enregistrements moins un, mais cette fois il me ramene qu'un seul ligne.
autre chose, lorsque je lance un deuxieme client, il me ramene rien.
s'il vous plait essayer de voir le code en détail, parcque je suis pressé par le temps et je dois rendre le projet le plus tot possible parceque j'ai déja depasser les délais
Hello,
J'ai bien regardé ton code et il n'y a "aucun" problème pour la partie réseau.
En fait comme ton serveur ferme bien sa connexion après avoir envoyé ttes ses lignes, même si le client reste en mode "read" avec in "in.readLine()", le fait de fermer la connexion va lui faire lancer une SocketException "Connexion reset"
La ou ca ne va pas par contre c est quand tu ajoutes tes éléments dans la liste coté client (Extrait de ton code):
dlm représente ta liste mais tu lis d'abord un élément que tu n'ajoutes pas à ta liste.
A la louche je dirais que le code corrigé doit etre celui ci (sans tester):
Pour le deuxième point, si tu relances un client il ne se passe rien, c est normal puisque ton instance de serveur une fois qu elle a fini son boulot, elle s arrete.
Pour que ca marche il faudrait que tu lances en boucle des instances de ton Thread serveur.
Bonne chance,
Niroken
j'ai essayé avec
mais cette fois il m'affiche un nombre aléatoire d'enregistrement parfois 2 ou 4 ou 5, je sais pas pourqoui
pour le thread serveur j'ai ajouté une boucle while(true) et ca marche, je peux lancer plusieurs clients maintenant sans problemes
mais s'il vous plait qi vous avez une solution pour le premier probleme, ca sera un grand plaisir pour moi
Hello,
Voici ce qu'il se passe :
- Ton instance serveur écrit dans le flux sortant attaché à la socket ouverte... puis une fois qu'elle a fini, le thread meurt et la socket se ferme, sans se soucier de ce qui a été lu coté client.
- Ton instance client lit à son rythme sur le flux entrant lié à la socket ouverte ce que le serveur lui envoit, le hic c'est que si la socket est fermé avant que le client aie tt lu, et bien tu vas avoir une exception qui va ressortir.
Ce que je te suggère, c'est d'implémenter une mini conversation client-serveur. dès que le serveur envoie une ligne, le client lui en renvoit une pour dire qu'il la bien lu, de cette facon quand le serveur fermera la socket, le client aura bien tt recu.
Coté implémentation, ca donnerait qq chose comme ca :
Cote client :
Cote serveur :
Bonne chance,
Niroken
j'ai changé le code avec ce ke vous avez proposé, ca affiche tous les utilisateurs au niveau System.out.println(req); mais le client est bloqué et il affiche rien, j'ai essayé le truc de inputstream mais ca marche pas.
j'ai trouvé des suggestions ki disent qu'il faut séparer les threads, une pour l'ecriture et l'autre pour l'ecture, si vous avez des idées pour résoudre ce probleme, surtt pour cette idée de séparer les threads ?
Hello,
Juste pour etre sur : j'ai mis des System.out.println() juste pour tester l affichage, est ce qu'il écrit bien le dernier
?????
Sinon pour mon test, j'ai crée deux classes distinctes Une qui contient le code serveur, une autre qui contient le code client, je les ai lancé et ca a marché, c'est a dire que j'ai affiché la taille de la liste.
Bon sinon je vais te faire un petit code qui s occupe de faire ca.
Bonne chance,
Niroken
Hello,
Voici un code complet qui marche : (je n'ai pas mis de connexion à une base de données tu feras ca)
Bonne chance,
Niroken
je suis vraiment desolé, j'ai essayé d'implementer ton code mé j'ai pa arriver, est ce ke tu peux adapter le code totalement a mon projet ?
Hello,
Hmm, as tu réussi à faire fonctionner mon code déjà?(indépendamment de la partie connexion base de données).
Si oui : je te posterais un code dans lequel tu pourras facilement implémenter une connexion à la base de données.
Si non : j'aimerais bien comprendre ce qui t as bloqué..... avant d'implémenter autre chose.
Bonne chance,
Niroken
Hello,
Tout d'abord mille excuses, j'ai raconté une grosse c...... :)
Ce qui m'avait troublé dans tout ca c'était le fait que ton client n'affiche à un moment donné qu'une partie ou pas du tt de données, et que le nombre de lignes affichées pouvait être aléatoire.
J'ai donc pensé que c'était parcequ'une fois que le serveur avait tout envoyé il se fermait et le client pouvait ne pas avoir tt lu.
C'est donc pourquoi je me suis dis... le client va dire au serveur a chaque ligne qu il la bien recu, de cette facon une fois que le serveur va fermer sa connexion on est sur que le client a bien tt recu.
Le hik c'est que j'ai refait un test et je n'obtenais pas la même chose, et je me suis apercu, que dans ton code serveur tu faisais :
au lieu de
Je me suis basé la dessus et tout le problème venait de la. Ce n'était pas la bonne socket que tu as fermé. Du coup dans mes précédents posts je t'ai proposé une usine à gaz, qui marche certes mais qui n'est pas super performante(bcp d envois reception de données inutiles).
Du coup je me rebase sur ce que tu avais fait précédemment et ca donne :
Code serveur :
Code client :
Bonne chance et dsl encore,
Niroken
tu voulais dire sService.close() au lieu de sEcoute.close(), j'ai essayé mé ca marche pa, au niveau System.out.println(req) il affiche la liste mé dans la jliste il affiche rien.
Hello,
Dans ce cas c est autre chose, si tu récupères les données quand tu les affiches, le client a bien fait son boulot, c'est au niveau de la couche graphique que ca ne va pas.
Bon je te passe la un code qui fonctionne de mon coté, j'ai réimplémenté le serveur et le client en gros quand tu charges ta fenetre client et que le serveur est lancé... le serveur envoit n fois "Pouet" puis il incrémente n de 1 comme ca quand tu cliques sur refresh, tu affiches un élément de plus à chaque fois.
Pour mettre ta partie base de données il faudra que tu modifies légérement la méthode sendDatasToClient()
Code Serveur :
Code Client :
Merci infiniment pour votre aide grace a la quelle je peux maintenant recuperer ma liste des utilisateurs depuis mon serveur.
maintenant apres ke j'ai en main l'ip du destinataire , je veux communiquer directement avec ce ip sans passer par le serveur, donc mon programme dois comporter une serverSocket et socket en meme temps, mé cela me permet pa de mettre l'ip ke je veux dans la socket
donc je dois declarer une autre sockt ou koi ?
En principe la communication dans un chat passe par le serveur. Mais bon pourquoi pas ?
Non mais tu peux tester qui s'est connecté.
accept te retourne un objet Socket. Là tu appelles getInetEddress. Et après de l'objet InetAddress tu appelles getHostAdress et là tu regardes qu'elle IP c'est. Si ça te convient tu continues, sinon tu fermes le socket.
apparemnt j'ai une fausse idée de communiquer directement sans passer par le serveur.
j'ai changer d'idée et je compte utiliser le serveur pour les communications entre clients, si vous avez des propositions pour le code, ca sera un grand plaisir pour moi.
Hello,
Je te posterais un bout de code qui s'occupera de ca :) D ici la, patience :)
Niroken
ok, merci ppur l'aide
slt, j'ai essayé de rendre la communication directe entre clients sans passer par le serveur, voila le code ke j'ai écrit mé ca passe pa, je sé pa porkoi ?
je veux aussi ajouter a mes jtextarea des JScrollPane, est ce ke vous avez une idée, comment faire cela ?
Hello,
Tout d'abord voici, un petit code qui te permet d'afficher un JTextArea dans un JScrollPane dans une fenetre.
Les barres de défilement horizontale et verticale n'apparaitront que si nécessaire.
Sinon pour ce qui est de ta communcation client-serveur, il y a quelque chose qui ne va pas.
Tu lances le client et le serveur dans le même Thread si j'en juge ta méthode main et le fait que tes fonctions clients et serveurs ne sont pas lancées dans des Threads séparés.
En gros ce qu'il va se passer..tu lances le serveur..celui ci va bloquer au niveau de la méthode accept(). Comme le serveur est bloqué et que dans l'ordre des instructions tu lances ton client après, celui ci ne sera jamais lancé puisque le serveur est bloqué.
Donc pour commencer, je te suggère de mettre le code client et le code serveur dans deux fichiers de classes distincts avec chacun leurs propres méthodes main.
Tu lances le serveur dun coté et le client de l'autre et tu me dis ce qu'il se passe si ca tourne mal :)
Sinon je t'avais dis que je te passerais un petit exemple de Tchat client-serveur, c'est un peu plus long à implémenter que ce que j'avais pensé, je te le posterais donc d'ici la fin de la semaine :)
Bonne chance,
Niroken
Merci infiniment pour votre aide.
le probleme c ke je veux pa séparer client et serveur, parce ke au niveau de mon chat voici c ke je compte faire:
l'utilisateur se connecte au serveur, ce serveur sa principal fonction c'est k'il contient la base de données des utlisateurs,
si client se connecte il charge la liste des connéctés depuis ce serveur, aprés il communique directement avec un autre client a travers l'ip ki a pu récuperer depuis le serveur, donc chaque client doit jouer le role du client et serveur en meme temps pour communiquer avec un autre client, c pour ca ke j'ai met code client et serveur dans le meme fichier.
autre chose lorske je fais l'authentification ca passe mé le formulaire d'authentification reste toujours afficher, je fais :
mé ca reste toujours afficher.[/code]
Arrête moi si je me trompe, mais si tu fais ça, rapidement tu vas avoir des serveurs désynchronisés au niveau de la liste des connectés. Pour y remédier il va falloir qu'un client se connecte à tous les serveurs systématiquement et éventuellement informe certains de ceux-ci des ajouts dans la liste des connectés. Je ne suis pas sûr que ça soit tout simple ton truc là.... Enfin je n'ai peut être pas bien compris ?
Remarque il y a un autre moyen de régler ça: écrire le tout non en Java mais en Erlang. Avec sa base de données distribuée en mémoire (Mnesia) Erlang te permettrait de faire ce que tu veux facilement. Mais c'est uen autre histoire....
Hello,
Alala, il est très bien ce Java :D
Bon indépendamment de ca, l'avantage d un chat c'est que l'on a pas besoin de faire des conversations très rapprochées dans le temp, une conversation relancée toutes les (500 ms) est bien suffisante à mon avis.
Du coup dans ton instance serveur, tu gardes la liste des connectés, et a chaque fois qu un client envoit au serveur un potentiel nouveau message puis récupère les messages des autres clients, le serveur envoie aussi la liste actualisées des clients connectés.
De plus j'insiste lourdement sur le fait que tu ferais mieux de séparer ton code client et serveur dans au moins deux fichiers de classes distincts.
D'une part c'est plus propre, et tu as une architecture plus simple à gérer.
Un serveur qui conserve la liste des clients connectés et des nouveaux messages en attente, et les clients qui viennent faire des requetes sur ce serveur pour envoyer de nouveaux messages puis récupérer les messages et la liste des clients connectés :)
Bonne chance,
Niroken
Sans doute :)
Mais Erlang aussi et c'était une occasion de faire connaître autre chose.
Il y a quelque chose que je ne comprends pas bien soit 4 clients/serveurs A,B, C,D.
A et B parlent entre eux C et D parlent entre eux. Comment C et D peuvent -il connaitre la présence de A et B sur le chat ? Remarque peut être que l'idée est justement que la présence de A et B ne soit pas connue :) Ou peut êtrre aussi que je n'ai rien pigé du tout :D
Hmmm je t'avoue que pour moi il était question que A, B , C, D coomuniquent tous avec le même serveur S. et que c'est le serveur S qui renvoit les données au(x) client(s).
Dans le cas ou c'est vraiment A et B qui parlent entre eux et C et D aussi, alors on peut peut être envisager de déclarer un attribut statique dans sa classe, il sera commun à toutes les instances, ensuite ben je sais pas trop j'ai pas réfléchi :D
Niroken
Le fait est qu'un chat c'est comme ça
mais il dit bien:
J'ai compris que chaque client était aussi un serveur. Mais bon il va nous préciser son idée je pense
bonjour, je crois que j'etais pas clair dans mes messages, voila l'histoire complete:
j'ai une base de données access avec une table uthentification qui contient les champs: login, password, ip, statut.
a chaque fois qu'un utilisateur se connecte, je change tous simplement son statut dans la base de données serveur,
statut='c' pour un utlisateur connecté et statut='d' pour utilisateur deconnecté, et je change ausssi son ip a chaque fois qu'il se connecte.
si un nouveau utilisateur veut se connecter au chat, d'abord il passe par un formulaire d'authentification, si il n'est pas inscrit je lui donne la possibilité
d'inscription, voila une image qui traduisent ce ke j'ai dit :
http://www.monsterup.com/image.php?url=upload/1233234983.jpg
apres une bonne authentification l'interface client apparut, voila de koi s'agit il:
http://www.monsterup.com/image.php?url=upload/1233235293.jpg
a droite c la liste des utilisateurs connectés, ca veut dire ki ont le statut='c' dans la bd serveur, j'ai pa trouvé d'autre solutions pour rafraichir automatiquement cette
liste, alors j'ai ajouté une boutton pour rafraichir,
je choisit un utilisateur de la liste pour communiquer avec lui puis je récupere sans ip de la bd serveur, apres je veux communiquer directement avec
cette utilisateur puiske j'ai son ip alors c pa la peine de passer par le serveur, voila c dans cette étape ke je suis bloqué,
ce ke j'essaye de vous expliquer c ke dans la discussion entre 2 utilisateurs il ya pa de client et serveur, tous les deux se comportent comme client
et serveur c pour cela j'ai essayé d'ecrire tous le code dans le meme fichier, alors c pa la peine ke vous m'ecrire tout un code de chat client serveur
juste la partie ou je suis bloké .
Voici un lien ki contient tous le code source ke j'ai écrit juska mnt: http://up.sur-la-toile.com/im9S
je voudrais bien penser a d'autre solutions comme celle ke vous avez proposé mé le probleme c le temps.
Hello,
J'ai regardé ton code et je dois avouer que ce n'est pas évident évident.
Ceci parce que ton choix d'architecture est on va dire "original", mais ca le rend d'autant plus compliqué.
Ceci dit parmi la liste des erreurs que j'ai pu relever non exhaustive :
- Comme tu déclares plein d'instances serveur, si tu les joues sur le même poste, il y en a qui ne peuvent démarrer puisqu elles utilisent le même port d 'écoute, je pense au 3502 notemment qui est utilisé par ta classe serveur et client.
- Dans ta classe client j'ai vu des choses du genre :
Le serveur est en écoute donc les instructions suivantes ne seront pas jouées tant que le serveur n'aura pas recu de connexion de la part d'un client.....- J'ai vu aussi que tu déconnectait ton client après l'avoir lancé :D à lafin de ton main client.
Ensuite, je fais ressortir le problème qu'avait souligné Frédéric en disant que tu devais trouver un moyen de mettre à jour ta liste de clients connectés.
Tu as résolu ca en te connectant sur ton serveur principal pour réactualiser la liste de tes clients...donc tous tes clients ont en commun d'etre connectés a ce serveur, je ne vois pas pq tu ne t en sers pas aussi pour communiquer des messages.....
Pour être franc avec toi, comme tu as dis que tu étais préssé, je pense sincèrement que reprendre le choix d'architecture que frederic et moi te proposons ira plus vite que d'essayer de continuer dans cette voie. D'autant que tes classes contiennent deja quasimment tout le code nécessaire, il suffit juste de réagencer le code, et d'en enlever un peu.
A toi de choisir...
Je t'avais dis que je pouvais te poster un bout de code pour un Tchat client-serveur, tu n'en veux plus?
Bonne chance,
Niroken
wé merci, c pa la peine de vous ecrire un chat client serveur, parcke si j'arrive a résoudre le probleme dessous, c suffisant pour moi.
ok, je suis d'accord avec vous, c mieux ke les messages passent par le serveur, mé je sé pa comment faire, si vous me proposé klkc ca sera tré beau pour moi ?
Très bien :)
Je te fournis un exemple dem1 à partir de ton code.
Niroken
ok, merci bcp.
bonjour, s'il vous plait, est ce ke vous avez trouvé des difficultés pour me fournir le code, ke vous m'avez promis pour hier, voila j'ai trouvé un code qui marche bien, j'ai essayé de l'adapter a mon application mé j'ai pa réussit, vous pouvez inspirer de ce code, et merci.
Hello,
Non rassures toi, j'ai réussit a me débrouiller, sauf que comme cela est un peu complexe.. je pense qu'on va procéder par étape.
D'une part, la base de données pour l'instant ce n'est pas une bonne idée..puisqu'elle ne fait que contenir des infos style "login" "password".
Mais créer un compte ne nous apporte rien puisqu on peut en créer un à chaque fois et comme aucune autre info n'est persistée du genre "amis ou contacts" favoris... c'est inutile.
Le serveur seul va gérer les connexions et savoir qui est connecté ou pas.
Donc la première étape, c'est justement la facon dont le serveur gère les connexions :
1) On allume le serveur en attente de connexions et garde en mémoire une liste de noms qui correspond au nom de chaque client.
2) Un client se connecte : L'utilisateur saisit un nom pour la durée de son tchat et l'envoit au serveur.
3)Le serveur recoit le nom, si le nom est deja présent dans la liste, alors le serveur dit que c'est pas bon au client et le socket se ferme. Si c est bon le serveur rajoute son nom a cette liste
4)Le client connecté envoit périodiquement une requete au serveur pour lui demander de reactualiser sa liste de connectés.
5)Le serveur renvoit au client cette liste.
Pour l'instant aucune partie envoie reception de message de tchat n'est gérée, mais tu verras bien que la liste d'affichage des clients est bien reactualisée a chaque fois qu 'un client se connecte/déconecte.
Code client (a partir du tien) :
Code serveur (Refondu complètement) :
Je te laisse regarder ce code, si tu as tt compris tu me dis et on passera à l étape deux : l'envoi reception de données de tchat.
Bonne chance,
Niroken
slt, merci pour le code, tout est clair, c ke j'ai pa bien compris c le HashMap et son fonctionnement.
j'ai executé le code sur la meme machine le client et le serveur, ca marche tres bien, je lance plusieurs clients sur meme machine et ca marche osi.
j'ai executé le code sur deux machines, serveur sur l'un et client sur l'autre mé ca marche pa (je change l'ip du socket client avec l'ip du serveur) :D
voici l'erreur au niveau client:
java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.(Unknown Source)
at java.net.Socket.(Unknown Source)
at client$5.run(client.java:221)
java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.(Unknown Source)
at java.net.Socket.(Unknown Source)
at client$5.run(client.java:221)
java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.(Unknown Source)
at java.net.Socket.(Unknown Source)
at client$5.run(client.java:221)
java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.(Unknown Source)
at java.net.Socket.(Unknown Source)
at client$5.run(client.java:221)
java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.(Unknown Source)
at java.net.Socket.(Unknown Source)
at client$5.run(client.java:221)
si vous arrivez a resoudre ce petit probleme, vous pouvez me communiquer avec, le code d'envoi et reception de message(chat), et merci infiniment :D
Hmmm
J'ai de mon coté fait le test suivant :
- Serveur sur un poste et client sur le même poste.
- Client sur un autre poste
Je n'ai eu aucun soucis.
Cependant, ton erreur "Connection timed out" me ferait davantage penser, à un firewall qui bloque l échange de données sur le réseau.
--------------------------------------------------------------------------------
Ensuite il est vrai que mettre les infos de connexions en dur dans le code, c'est moyen donc je te passe ceci :
C'est une classe utilitaire crée par moi :) qui permet de lire les fichiers de configuration (.properties) en java
Je te met ici la méthode à modifier coté client :
La méthode à modifier coté serveur :
Tu dois donc éditer un fichier de config pour le serveur que tu mettras dans le répertoire ou s executes ton serveur "serveur.properties"
De même pour le fichier de config client "client.properties"
C'est plus propre comme ca tu peux modifier la config, sans changer le code.
Pour en finir je vais répondre à ta dernière question : la HashMap
En fait il s'agit d'une structure de données indéxée : ici c'est par nom de client.
Structure de données, oui, mais quelle données??, ici cette HashMap va contenir la liste des messages en attente pour chaque client.
J'avais préparé le terrain pour l'étape 2 :
- Toutes les 1s le client envoit une requete au serveur, dans cette requete on va également envoyer ce que le client a saisi.
- Le serveur va recevoir cette requete et va ajouter le ou les messages du client aux listes de messages en attente de tous les autres clients.
- Puis le serveur renvoit au client sa liste des messages en attente.
La dans le scénario que je viens de décrire, a chaque fois qu un client ecrira un message, il sera vu par tous les autres clients.
Mais si tu veux ecrire un "private message" visible que par un seul client, le serveur ajoutera le message du client seuelement au client destinataire concerné.
L'interet de la HashMap c'est que comme c'est indéxée par nom de client, si tu veux atteindre la liste des messages dun client donné : tu fais :
Où vHashMap est une instance de HashMap.
Je te passe la partie pour le tchat dem1, faut quand même le temp de la coder :)
Bonne chance,
Niroken
Hello,
Voici le petit Tchat client/serveur bien avancé avec la gestion des envois/réception de messages.
Il y a évidemment moyen d'optimiser ca : la je n'ai mis qu'une gestion très légère des exceptions et le code est un peu mélangé, on aurait pu factoriser ca un peu mieux, ceci dit, ca marche...je te tansmets donc le code complet :
Code client :
Code serveur :
ConfigReader :
ClientMessage :
Ce tchatter est fonctionnel, ceci dit, je n'ai pas géré l'envoi de messages privés :) , ca fera un bon exercice pour toi :)
Bonne chance,
Niroken
Merci pour le code ca marche parfaitement.
j'ai essayé d'ajouter des jscrollpane au zone de text d'envoi et de reception, avec le code ke tu m'as donnée l'autre fois mé ca marche pa:
osi j'ai essayé de faire les messages privés mé vu ke ton code est un petit peu long, j'ai pa réussit à le faire.
Merci de me résoudre ces deux problemes ki restent.
osi j'ai besoin de ton nom pour le mentionner dans le rapport. :D
Lol jvais avoir une bonne note dis donc.
Bah écoute, jte ferais ca, d ici dem1, après-dem1.
Niroken
Merci bcp, bien sur ke tu aura une bonne note :D
salut, est ce ke ca va ?
est ce ke t'as rencontré des problemes pour les deux trucs, j'éspere ke ca marche pour toi
Hello,
Si je n'ai pas encore donné suite, c'est plus par manque de temp en fait, mais je vais m'y atteller ce soir, j'espère avoir fini donc.
Niroken
ok, merci, j'espére ke tu finira aujourdhui, aufwiedersehen :D
slt, ca va bien Niroken ?
je crois que tu m'as oublié, voila mon msn: eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%74%61%6f%75%66%69%6b%31%30%39%40%68%6f%74%6d%61%69%6c%2e%63%6f%6d%22%3e%74%61%6f%75%66%69%6b%31%30%39%40%68%6f%74%6d%61%69%6c%2e%63%6f%6d%3c%2f%61%3e%27%29%3b')),
juste pour communiquer plus vite, merci.