Envoi de messages du serveur à tous les clients

J’ai créé un programme de discussion, mais je ne peux pas comprendre un petit aspect. La façon dont cela fonctionne maintenant est comme ceci:

Le serveur démarre

Le client 1 se connecte

Le client 2 se connecte

Le client 1 envoie un message: bonjour.

Le serveur reçoit le message et l’envoie à tous les clients connectés.

Le principal problème est que le serveur envoie également le message du client 1 au client 1, donc il y a maintenant 2 “bonjour” au lieu de 1.

Voici mon serveur.java

for (Iterator e = clients.iterator(); e.hasNext(); ) { DataOutputStream dout = (DataOutputStream)e.next(); dout.writeUTF(message); } 

Tout d’abord, changez le type de clients list en Socket

 static List clients = new ArrayList(); 

Ensuite, créez une variable publique de type Socket pour contenir le client émetteur.

 private static Socket senderSocket; 

Après cela, remplacez ceci:

 Socket s = ss.accept(); System.out.println( "Connection from " + s ); DataOutputStream dout = new DataOutputStream(s.getOutputStream()); clients.add(dout); 

avec ça:

 Socket s = ss.accept(); System.out.println( "Connection from "+s ); //DataOutputStream dout = new DataOutputStream(s.getOutputStream()); clients.add(s); 

Enfin, changez la boucle for :

 for (Iterator e = clients.iterator(); e.hasNext();) 

dans:

 for(Socket s : clients) 

Et, dans chaque client créez le DataOutputStream et écrivez votre message. Et bien sûr, vous devez ignorer le client qui correspond à l’expéditeur dans son socket.

Il existe plusieurs façons de résoudre ce problème. Si vous écrivez des chaînes sur le réseau, vous pouvez simplement créer une chaîne d’parsing contenant le nom d’utilisateur (ou un autre identifiant unique) et un message, avec un séparateur que vous pouvez utiliser .split ().

Si vous écrivez des objects, vous pouvez créer une classe Message qui contient une chaîne (le message) et un identifiant unique, comme un nom d’utilisateur ou une adresse IP, puis les écrire.

Lorsque votre serveur obtient soit, vérifiez simplement si l’origine == la destination et ne l’envoyez pas.


Ou ne vous envoyez pas le message en premier lieu. Si vous envoyez “Hello” comme un message, envoyez-le seulement, alors quand vous le récupérerez, vous pourrez alors l’afficher.