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

Collection et Stream Java Discussion :

ArrayList static non static


Sujet :

Collection et Stream Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 40
    Points : 31
    Points
    31
    Par défaut ArrayList static non static
    Bonjour,

    Je suis en train de faire un Chat en local, mais je rencontre un problème, pour m'assurer qu'il n'y est pas 2 utilisateurs connecté avec le même pseudo j'ai une arraylist statique au niveau du serveur contenant tout les utilisateurs connecté au système.

    Depuis ma classe client je fais appel à addUsers, méthode static de ma classe serveur qui va vérifier la présence du pseudo, si il n'y est pas alors ajout dans l'arraylist, le problème c'est que l'ajout n'est pas pris en compte on dirais qu'il agit comme une nouvelle variable d'instance alors que j'ai bien déclaré l'arrayliste en statique.

    Codes classe 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
     
    //Connexion au serveur et ajout de l'utilisateur dans la liste reprenant ceux-ci.
    		       if(MessengerServeur.addUsers(nomUtilisateur))
    		       {
    	               socketClient= new Socket(InetAddress.getByName(adresseServeur), PORT_SERVEUR);
     
    	               //Créer le Thread de réception des messages entrants.
    	               threadRecepteur= new ThreadRecepteurPaquet(ecouteur);
    	               threadRecepteur.start();
     
    	               //Mettre à jour le drapeau estConnecte.
    	               estConnecte= true;
     
    	               //Affichage nouveau utilisateur connecté. 
    		           //Créer et démarrer un nouveau ThreadEmetteur pour livrer le message.
    	               new ThreadEmetteur(socketClient, nomUtilisateur, "vient de se connecter à " + new DateJour().getCurrentHour() + ".", true).start();
    		       }
    		       else retour=1; //Nom d'utilisateur déja existant.

    Codes serveur :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    //ArrayList contenant la liste des utilisateurs connectés sur le serveur. 
    	public static ArrayList<String> listeUsers=new ArrayList<String>();
     
    	//Démarrer le serveur de chat.
    	public void demarrerServeur() {      
    	   //Créer le serveur et administrer les nouveaux clients.
    	   try {
     
    	      //Créer un ServerSocket pour les connexions entrantes.
    	      ServerSocket socketServeur= new ServerSocket(PORT_SERVEUR, 100);         
    	      System.out.println("Le serveur est à l'écoute sur le port " + PORT_SERVEUR + " ...");
     
    	      //Se mettre à l'écoute permanente de clients.
    	      while (true) {
    	         //Accepter la connexion d'un nouveau client.
    	         Socket socketClient= socketServeur.accept();
     
    	         //Créer un nouveau ThreadRecepteur pour la réception
    	         //de messages d'un client.
                 new ThreadRecepteur(this, socketClient).start();
     
    	         //Afficher les informations de connexion.
                 System.out.println("Connexion reçue de : " + socketClient.getInetAddress() + " Nb users connectés : " + listeUsers.size());
     
    	      } //Fin boucle while.
     
    	   } //Fin de try.
     
    	   //Gérer toute exception à la création du serveur
    	   //et à la connexion des clients.
    	   catch (IOException ioException) {
    	      ioException.printStackTrace();
           }
    	} 
     
     //Méthode qui ajoute un utilisateur à la liste si celui ci n'existe pas.	
    	public static boolean addUsers(String nomUtilisateur) {
    		if(listeUsers.contains(nomUtilisateur)) return false;
    		else {
    			listeUsers.add(nomUtilisateur);
    			return true;
    		}
    	}

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    Je viens de me rendre compte que le problème c'est que je n'arrive pas à modifier ma variable static depuis une autre classe, mais je ne sais pas pourquoi ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Points : 595
    Points
    595
    Par défaut
    C'est normal si tes clients sont lancés indépendamment les uns des autres (ce qui est probable pour un chat).

    Tu n'as pas montré assez de ton code pour en être sûr mais ton problème suppose qu'il y a plusieurs instances de JVM qui tournent.
    Aussi, tu dois probablement avoir un processus pour le serveur (une classe avec un static void main(args[])) et un autre processus pour chaque client (avec une autre classe static void main(args[])) que tu lances autant de fois que tu as de connectés.
    C'est bien le cas ???

    Edit de ma réponse : Je préfère être sur de ta réponse avant d'en venir aux solutions

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    Oui c'est exactement ca, j'ai un main pour ce qui est du serveur, et un main pour le client.

    Je lance donc d'abord le serveur, puis 2 client par exemple.

    Donc si je te suis bien c'est parceque c'est 3 applications différentes donc indépendantes en termes de variables ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Points : 595
    Points
    595
    Par défaut
    Ok !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessengerServeur.addUsers(nomUtilisateur)
    Dans ce cas, le problème vient que ton code client accède à un classe supposée être localisée côté serveur sauf que c'est n'est pas le cas : elle se trouve coté client en fait.

    Si tu veux que les clients lancés par des processus java différents partagent avec le serveur une liste de connectés, tu dois centraliser la liste de connectés et la mettre vraiment coté serveur, et le serveur pourra alors maintenir la liste des connectés.
    Je vois que tu utilises les sockets, au lieu de faire ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessengerServeur.addUsers(nomUtilisateur)
    , fait en sorte que ton client écrive vers le socket du serveur sa demande de
    connection avec le pseudo associé.
    Lorsque le serveur recevra ce message, il traitera sa demande selon l'état de la liste des connectés qu'il est maintenant seul à détenir.

    Autre solution : n'utiliser qu'un seul processus et plusieurs threads rattachés à ce processus.
    Ce qui est possible à mettre en place pour un chat purement local mais inutilisable sur un chat distribué.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    Merci infiniment, vraiment j'aurais encore peu chercher longtemps...

    Donc voila j'ai effectué une centralisation au niveau du serveur, acceptation ou refus, et ca marche parfaitement bien.

    Merci encore .

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Points : 595
    Points
    595
    Par défaut
    Cool
    Ca me rappelle moi quand étudiant, j'avais fait un petit chat

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Static / non static Utilisation Java
    Par Bobble dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 04/11/2009, 16h59
  2. appel static/non static
    Par greg08 dans le forum Langage
    Réponses: 3
    Dernier message: 27/11/2008, 10h25
  3. Pb de fonction ( static / non static )
    Par Luffy49 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 07/05/2007, 13h28
  4. static / non-static ???
    Par benkunz dans le forum Langage
    Réponses: 4
    Dernier message: 05/04/2006, 09h49
  5. [débutant] Static références et non-static références ?
    Par Sarvok dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 01/11/2005, 12h51

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