IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Problème suppression Sockets d'une collection


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Points : 69
    Points
    69
    Par défaut Problème suppression Sockets d'une collection
    Bonjour a tous, j'aimerai vous faire part d'un probleme qui me perturbe.
    Je suis actuellement en train de développer un tchat en java et je rencontre un probleme que j'arrive plus ou moins à le résoudre, il s'agit de la suppression d'une socket d'un client coté serveur lorsque le client se déconnecte.

    Lorsque je connecte 1 seul client au serveur tout marche nickel, mais la chose se complique lorsque je connecte 2 clients sur le serveur, voici le probleme :

    - lorsque je connecte le client A puis le client B, le serveur m'affiche 2 clients (ce qui est normal). Ensuite lorsque je deconnecte le client B, le serveur m'affiche 1 client (le client A donc)

    Par contre

    - lorsque je connecte le client A puis le client B, le serveur m'affiche 2 clients (ce qui est normal). Ensuite lorsque je deconnecte le client A, le serveur m'affiche 0 client, ce qui signifie que le serveur me supprime les 2 clients connectés hors il aurait du m'en supprimer qu'un seul car je ne deconnecte qu'un seul client qui est le client A.


    J'aimerai comprendre pourquoi lorsque dans un ordre donné le serveur me supprime 1 client mais que dans un ordre inverse, celui ci me supprime tout les clients contenu dans une collection coté serveur ?

    Est ce que c'est parce qu'il on la meme socket ?
    Est ce que c'est du au fait que je lance les 2 clients sur la meme machine ?

    Voila j'aimerai avoir des éclaircissements la dessus si c'est possible.

    Dans l'attente d'une réponse de votre part, je vous remercie d'avance

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    ... Tu pensais qu'on allait deviner comment tu crées et supprimes tes Sockets ?

    Eh bien non...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Points : 69
    Points
    69
    Par défaut
    Désolé. Voici donc le code source.

    Coté serveur :

    J'ai implémenté un thread qui permet au serveur d'ecouter sur un port sur lequel les clients se connectent, une fois que le serveur a intercepté une connexion de la part d'un client, le serveur stock le socket de ce client dans un List<Socket> socketClients :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    socketClient = socketServer.accept(); // permet de prendre la socket du client qui va se connecter
     
    				InputStream fluxEntree = socketClient.getInputStream(); // lit les flux entrant de la part du client	
    				OutputStream fluxSortie = socketClient.getOutputStream();
     
    				clientsInputStream.put(socketClient,  fluxEntree);
    				clientsOutputStream.put(socketClient,  fluxSortie);
    				socketClients.add(socketClient);
     
    				RunnableEcouteMessageDesClients ecouteMessagesClient = new RunnableEcouteMessageDesClients(clientsOutputStream, socketClients, clientsInputStream, socketClient);
    				Thread threadEcouteMessageClients = new Thread(ecouteMessagesClient);
    				lesThreadEcouteursDeMessages.add(threadEcouteMessageClients);
    				threadEcouteMessageClients.start();
    Je lance ensuite pour le socketClient un Thread afin d'ecouter les messages du client.

    Coté client :

    Lorsque un client souhaite se deconnecter, le client clique sur un bouton bDeconnexion afin d'avertir le serveur (en lui envoyant un message)

    Voici le code permettant la deconexion du client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    PrintWriter envoyer_server = new PrintWriter(new BufferedWriter(new OutputStreamWriter(fluxSortant)), true);
    			envoyer_server.write("deconnexion client\n");
    			envoyer_server.flush();	
     
    				/*fluxEntrant.close();
    				fluxSortant.close(); */
    			try {
     
     
    			    clientSocket.close();
    				client.setArret(true);
    				this.connected = false;
     
     
    				textBoxMessages.append("Vous etes déconnecté\n");
     
    			} catch (IOException | NullPointerException e2) {
    				// TODO Auto-generated catch block
    				JOptionPane.showMessageDialog(this, "Un problème est survenue lors de la déconnexion","Avertissement", JOptionPane.WARNING_MESSAGE);
    			}

    Coté serveur :

    Une fois que le serveur reçois le message de la part du client en ce qui concerne la deconnexion, le serveur ferme la socket et le supprime de la collection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    message = buffer.readLine(); // renvoi null si un probleme est apparue
    				if(message.isEmpty() || message.compareTo("deconnexion client") == 0 )
    				{
     
    					this.buffer.close();
    					this.lesClientsInputStream.get(laSocketClient).close();
    					this.lesClientsOutputStream.get(laSocketClient).close();
     
    					this.laSocketClient.close(); 
    					this.lesSocketClients.remove(laSocketClient);
     
    					arret = true;
    					System.out.println("on ferme ! ");
    				};
    Voila. Si vous avez besoin de plus de code n'hésitez pas a demander.

Discussions similaires

  1. [Débutant] Problème suppression objet dans une collection
    Par ziggy76 dans le forum VB.NET
    Réponses: 2
    Dernier message: 11/03/2014, 23h16
  2. Problème suppression élément d'une collection
    Par drake56 dans le forum Langage
    Réponses: 17
    Dernier message: 29/04/2010, 15h50
  3. problème de position d'une collection
    Par john_wili dans le forum Struts 1
    Réponses: 11
    Dernier message: 04/04/2009, 23h05
  4. problème de socket dans une application win32
    Par deck_bsd dans le forum Windows
    Réponses: 5
    Dernier message: 20/01/2007, 18h32
  5. Problème de gestion d'une collection d'objet
    Par poolky dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/02/2006, 21h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo