Java – chat client spécifique au réseau serveur

J’ai créé un serveur de discussion simple qui écrit à tous les clients connectés (j’ai simplement posté le code de base pour plus de simplicité)

public class server extends Thread { private Socket clientSocket; private static ArrayList sockets = new ArrayList(); public server(Socket clientSocket) { this.clientSocket = clientSocket; sockets.add(clientSocket); } public void run() { while (true) { try { for(Socket s: sockets) { //write something //the for loop will send it to every socket in the array } } catch (Exception e) { //catch it } } } } 

Maintenant, je veux être plus précis dans quel client je veux envoyer le message, tout comme la façon dont une application de discussion réelle aura différentes salles de conversation.

Donc, si Client1 se connecte au serveur, il voudra démarrer un groupe de discussion nommé “Apple”. Et puis, lorsque Client2 et Client3 se connectent, ils peuvent choisir de rejoindre le groupe “Apple”. Simultanément, le client 4 se connecte au serveur et crée un autre groupe de discussion appelé “Banana” où d’autres clients peuvent se connecter et parler.

Je crois comprendre que je dois identifier d’une manière ou d’une autre chaque client que le serveur accepte (je n’ai aucune idée de la manière de le mettre en œuvre). Puis-je les mettre en quelque sorte dans leur propre tableau en fonction de leur nom de groupe de discussion?

J’ai cherché la semaine dernière des exemples de codes qui permettent plus d’une discussion de groupe simultanément, mais tout ce que j’ai vu ne concerne que 1.

    La solution la plus simple consiste à utiliser et hashmap avec key = nom de la pièce et valeur = une liste d’utilisateurs dans le chat. En pratique:

     HashMap> rooms = new HashMap<>(); 

    Lorsqu’un nouvel utilisateur se connecte, il doit envoyer un message avec le nom de la pièce qu’il souhaite joindre et ensuite vérifier si la pièce existe déjà ou non:

     ArrayList clientsList = rooms.get(roomName); if(clientsList == null) { clientsList = new ArrayList(); rooms.put(roomName, clientsList); } clientsList.add(socket); 

    Une autre bonne idée pourrait être de créer une classe Client contenant le Socket avec d’autres informations (par exemple le nom d’utilisateur).

    Pour l’aspect performance, je vous suggère de jeter un coup d’oeil à Java nio, nio2. Avec nio, vous pouvez gérer les connexions de manière asynchrone et ne perdez pas 1 thread par connexion. L’implémentation de socket standard présente certains inconvénients.

    Comme solution à votre problème, je préférerais séparer l’en-tête et le contenu d’un message envoyé / reçu. Dans l’en-tête, il y aura un utilisateur source, un utilisateur / groupe cible, etc. Votre client comprendra et imprimera les messages dans les fenêtres de discussion associées avec l’expéditeur correct.

    Du côté du serveur, les utilisateurs peuvent mapper quelle clé est nomutilisateur et valeur est object utilisateur. ChatGroups mappe quelle clé est nomGroupe et valeur est la liste des noms d’utilisateur. Etant donné que les relations sont nombreuses et nombreuses, vous devez également garder tous les groupes participants. Vous pouvez soit placer un GroupNameList dans User Object ou définir une carte séparée.

    Écouter les sockets client sur l’action Fermer (possible avec nio) et supprimer l’utilisateur des groupes ou des cartes avec un mécanisme de blocage (access simultané)

    L’ajout d’un nouveau groupe, d’un nouvel utilisateur, etc. nécessite également la simultanéité des threads.