salut
comment faire une diffusion d'un message depuis un serveur vers plusieurs clients en utilisant les sockets en mode connecté sachant que les clients et le serveur se trouvent dans le localhost ???
Version imprimable
salut
comment faire une diffusion d'un message depuis un serveur vers plusieurs clients en utilisant les sockets en mode connecté sachant que les clients et le serveur se trouvent dans le localhost ???
De la même manière qu'en le diffusant à un seul client, mais cette fois tu le fais avec une boucle sur tous les clients.
Le multicast/broadcast en mode connecté, n'a pas vu de standard de fait s'imposer. De ce fait il n'y a pas d'implémentation fournie avec les OS courants, et Java n'en considère pas.
comment garder la trace de ces clients et comment les identifier de manière unique sachant qu'ils s'exécutent sur la même machine et ils ont forcément la même adresse IP ???
Chaque objet Socket obtenu avec accept() est différent et peut être placé dans une Collection<Socket>, comme une List<Socket> ou un Set<Socket>.
Comment ça marche derrière c'est une histoire de numéros de ports, mais t'en as pas besoin.
merci pour le message
j'ai essayé de faire le travail de cette manière ça marche pour le premier message seulement puis une exception se déclenche
voici les fichiers si vous voulez bien jeter un coup d’œil
Tu fermes le flux après le premier message, donc forcément, ça n'ira pas plus loin. Tu ne devrais pas créer de nouveaux writer sur la socket, puisque tu as déjà créé des writer dans GestionnaireClient. En fait, tu devrais ajouter dans GestionnaireClient une méthode qui ressemble à ça:Code:
1
2
3
4
5
6
7 for (i = 0; i < socketsClients.size(); i ++) { diffusion = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socketsClients.elementAt(i).getOutputStream()))); diffusion.println("DIFFUSION_MESSAGE"); diffusion.println(message); diffusion.flush(); diffusion.close(); }
stocker des GestionnaireClient et non pas des Socket dans ta collection, et modifier ta diffusion pour appeler cette méthode plutôt que d'attaquer directement les outputstream des socket. Si tu t'emmerde à créer une class GestionnaireClient autour de la socket, utilise là ;)Code:
1
2
3
4
5 public void diffusion(String message){ sortie.println("DIFFUSION_MESSAGE"); sortie.println(message); sortie.flush(); }
PS: et pense aussi à la gestion multithread correcte. Tu parcoure joyeusement et met à jour des listes dans plusieurs threads, tu manipule des outptustream depuis plusieurs thread. Il ne va pas falloir longtemps avant que tu te chope des corruption ou des erreurs liées à la concurrence.
merci pour les réponses
maintenant ça marche bien