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 :

[ObjectOutputStream] Pb de transfert d'objets


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 31
    Points : 34
    Points
    34
    Par défaut [ObjectOutputStream] Pb de transfert d'objets
    Je dois passer une liste d'objets d'un PC vers un autre.
    Mes informations circulent via un ObjectOutputStream/ObjectInputStream de la manière suivante :

    Connexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ServerSocket socketServeur = new ServerSocket(COMMUNICATION_PORT);
     
    Socket socketClient = this.socketServeur.accept();
     
    ObjectOutputStream flux = new ObjectOutputStream(socketClient.getOutputStream());
    Envoie de la Situation tactique mise à jour : Les attributs des objets (de type Mobile) sont modifiés avant chaque nouvel appel de la fonction
    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 void envoyerSITAC(Mission mission) {
     
    	try {
     
    		ArrayList messageAEnvoyer = new ArrayList();	
     
    		for (int i = 0 ; i < mission.getNbMobiles ; i++) {
     
    			messageAEnvoyer.add(mission.getMobile(i));
    		}
     
    		flux.writeObject(messageAEnvoyer);
    		flux.flush();
     
    	} catch (IOException e) {
     
    		e.printStackTrace();			
    	} 			
    }
    De l'autre côté le flux est exploité de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ObjectInputStream flux = new ObjectInputStream( new BufferedInputStream(clientSocket.getInputStream()));
     
    ArrayList messageRecuDuServeur = (ArrayList) flux .readObject();
     
    Mobile mobile = (Mobile) (messageRecuDuServeur.get(i));

    Mon problème est le suivant :
    Les attributs des mobiles que je reçoit ne sont pas mis à jour, je ne reçoit que les 'anciennes' version des objets.
    J'ai l'impression que comme les references de ces objets ne sont pas modifiées,
    le flux ne met pas à jour les nouvelles valeurs des attributs et conserve les anciennes valeurs.

    Y a t'il un moyen de spécifier ce changement sans avoir à crée une copie (donc une nouvelle reference) de chacun des mobile que je veux envoyer ?

    Merci
    M@tth
    The first Rule of the fight Club is , you don't talk about fight club ...

  2. #2
    Nouveau membre du Club
    Inscrit en
    Juillet 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    ta methode renvoie quoi exactement ?
    Et ce i il vient d'ou ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mobile mobile = (Mobile) (messageRecuDuServeur.get(i));

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 31
    Points : 34
    Points
    34
    Par défaut
    La methode getMobile(i) renvoie une reference vers un objet de type Mobile, une classe que j'ai créé.
    Cette classe represente un élément mobile dont les attributs, de type double, (latitude, longitude, altitude, vitesse, cap ...)
    sont mis à jour avant chaque envoie de la situationTactique vers l'autre PC.


    Pour ce qui est du i c'est une erreur de copier/coller dans le post :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (int i = 0 ; i < messageRecuDuServeur.size() ; i++) 
     
         Mobile mobile = (Mobile) (messageRecuDuServeur.get(i)); 
     
         System.out.println(mobile.toString()); // Affichage de tous les attributs du mobile
    }
    C'est cet affichage des attributs des mobiles qui me donne des valeurs identiques à chaque cycle (la valeur du premier envoi)
    The first Rule of the fight Club is , you don't talk about fight club ...

  4. #4
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 68
    Points : 72
    Points
    72
    Par défaut
    Il faut fermer ton flux après le flush, et le rouvrir avant de renvoyer ton objet. (Pareil mais à l'envers coté lecture, evidemment).

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 31
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par tileffeleauzed
    Il faut fermer ton flux après le flush, et le rouvrir avant de renvoyer ton objet. (Pareil mais à l'envers coté lecture, evidemment).
    Ce que tu appelle la réouverture du flux c'est ça ? :
    ObjectOutputStream flux = new ObjectOutputStream(socketClient.getOutputStream());

    Ou y a t'il une autre fonction ? (Je n'ai pas trouvé de open pour un ObjectOutputStream)
    The first Rule of the fight Club is , you don't talk about fight club ...

  6. #6
    Expert éminent

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Points : 8 235
    Points
    8 235
    Par défaut
    Si tu travailles avec des threads differents pour la mise à jour des valeurs et leur envoi, il faut que tu utilises le mot clé volatile dans la déclaration des attributs pour empecher la JVM de tenter d'optimiser leur gestion.

    Sinon il me semble avoir deja eu des problemes de fermeture de fluxqui déclenchait la fermeture de la socket.

  7. #7
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 68
    Points : 72
    Points
    72
    Par défaut
    Oui, la ré-ouverture de flux c'est le new Obj....

    Oui, la fermeture de flux d'objets déclenchera la fermeture de la socket, si ce flux est orienté vers une socket. Cela te gène-t-il ?... Dans ce cas, si tu veux éviter ouverture et fermeture, il faut utiliser la méthode writeUnshared pour écrire tes objets.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 31
    Points : 34
    Points
    34
    Par défaut
    Merci,

    Grace au mot clé volatile devant les attributs qui vont êrte amenés à évoluer
    et à l'initialisation du flux ( flux.reset()) avant d'envoyer les mobiles,
    je m'en suis sorti sans avoir à réouvrir et fermer le flux pour chaque envoi.
    The first Rule of the fight Club is , you don't talk about fight club ...

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

Discussions similaires

  1. [Applet]Transfert d'objet serialisé applet/servlet
    Par fanou28 dans le forum Applets
    Réponses: 7
    Dernier message: 22/02/2010, 21h45
  2. Logins droppé avec un Transfert D'objets
    Par Pmatt dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/03/2007, 00h26
  3. [JSP] Transfert d'objet
    Par GLDavid dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 19/09/2006, 12h04
  4. transfert d'objet avec SDL_Net
    Par phraides dans le forum SDL
    Réponses: 10
    Dernier message: 29/06/2006, 15h23
  5. Réponses: 3
    Dernier message: 08/09/2005, 10h45

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