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

  1. #1
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    novembre 2014
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2014
    Messages : 427
    Points : 140
    Points
    140

    Par défaut problème de NULL pour envoi d'un objet via une socket

    essayant d'envoyer un objet via d'un thread server vers un client par ObjectOutputStream, je reçoit une exception
    Exception in thread "Thread-4" java.lang.NullPointerException
    en déboggant, j'ai remarqué que l'objet de la méthode d'envoi obj est null, comme s'il n'a pas été remplace par celui passé en paramètres car pub n'est pas null, pourtant le même code fonctionnait avant que je mette le serveur dans un thread à part.

    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
     
    Socket socket;
    ServerSocket srv;
    Participant Ui;  //un client
    List<Participant> participants = new ArrayList<>(); //liste de clients
    Publication pub = new Publication(this.data); //objet à envoyer
    //thread serveur
    Runnable serverTask = () -> {
     
                  try {
                        srv = new ServerSocket(Integer.valueOf(txtPort.getText()));
     
     
                        for (int i = 0; i < nbrParticipants; i++) {
                            //serveur accepte la connexion d'un participant
                            socket = srv.accept();
                            Ui = new Participant(nonce, socket);
                            //ajouter le participant à connecté à la liste
                            participants.add(Ui);
     
     
                            //lancement du thread du nouveau participant
                            Thread thread = new Thread(Ui);
                            thread.start();
     
     
                            //incrémente le compteur afin d'attribuer un nouveau Id
                            nonce++;
                        }
     
     
                        //attendre que tous les candidats se connectent
                        //pour envoyer les données 
                        for (int i = 0; i < participants.size(); i++) {
                            participants.get(i).send(pub); //erreur exception ici
                        }
     
     
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                };
    Thread serverThread = new Thread(serverTask);
    serverThread.start();
    méthode send()
    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
     
    public class Participant implements Runnable {
        public void run() {        try {
                oos = new ObjectOutputStream(cnx.getOutputStream());
                ois = new ObjectInputStream(cnx.getInputStream());
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
     
        public void send(Object obj) {
            try {
                oos.writeObject(obj);
                oos.flush();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }   
    }

  2. #2
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    décembre 2011
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 258
    Points : 3 446
    Points
    3 446
    Billets dans le blog
    12

    Par défaut

    Salut,

    Je ne vois pas l'intérêt de mettre Participant Ui; //un client en attribut global, cela ne te sert pas et ne fera que te créer des bugs.
    D'où provient le nombre de participant nbrParticipants ?
    D'où provient le cnx ?

    A+
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  3. #3
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    novembre 2014
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2014
    Messages : 427
    Points : 140
    Points
    140

    Par défaut

    J'ai pu résoudre le problème du NULL, il s'agissait d'une erreur de synchronisation, car l'envoi du message démarrait avant le run où j'initialisait les ObjectStream, donc ils étaient NULL.

    Merci pour votre observation concernant la déclaration de l'objet en global, effectivement vous avez tout à fait raison, je l'ai déplacé.

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

Discussions similaires

  1. [PowerShell] Problème nom expéditeur pour envoi de mail
    Par ludo40190 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 06/08/2015, 10h54
  2. [AC-2003] Envoi de plusieurs objets via une seule macro
    Par Skoat dans le forum Access
    Réponses: 9
    Dernier message: 03/11/2009, 16h42
  3. Réponses: 1
    Dernier message: 12/12/2008, 08h57
  4. Réponses: 4
    Dernier message: 12/12/2006, 10h22
  5. Comment faire pour faire glisser un objet dans une form ?
    Par Olun dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/09/2005, 17h49

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