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 de communication par sockets


Sujet :

Entrée/Sortie Java

  1. #1
    Membre averti Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Points : 332
    Points
    332
    Par défaut Problème de communication par sockets
    D'abord bonjour à tous...
    Bon je poste un problème ici sur lequel je commence à m'arracher les cheveux...
    Je vous explique, je suis en train de créer une application serveur/client en java. Dans cette application, le serveur envoie des données modifiées toutes les 30 secondes à tous les clients connectés.

    Ca donne le Thread de la partie 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
     
    public void run(){
            System.out.println("Thread d'envoi démarré");
            while (active)
                try{
                    matrix.setProduction();
                    System.out.println("Envoi des données");
                    for (int i=0; i<nbSockets;i++)
                    {
                        System.out.println("[Serveur] "+matrix);
                        liste.get(i).writeObject(matrix);
                        liste.get(i).flush();
                        /*
                        liste.get(i).writeObject(new String("Ceci est le message!"+K));
                        liste.get(i).flush();
                        K++;
                         */
                    }
                    sleep(30000);
     
                }
                catch(Exception e){
                    System.err.println("Erreur lors de l'envoi "+e);
                }
     
            }
    Et le Thread de la partie 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
     
    public void run(){
            System.out.println("Thread de réception démarré");
            while (connected){
                Object o;
                try{
                    o = in.readObject();
                    System.out.println("Reception données");
                    // CA MERDE ICI: TOUJOURS LE MEME OBJET O AFFICHE!
                    System.out.println("[Client] Objet Recu"+ o);
                }
                catch(Exception e){
                    System.err.println("Erreur lors de la réception: "+e);
                    o = null;
                }
                // TESTS SUR LE TYPE DE O
                moniteur.receiveData(o);
            } 
        }
    La communication marche, puisque la matrice est bien reçue la première fois, mais ensuite même si l'affichage dans le serveur montre la bonne matrice modifiée, dans le client, c'est toujours la même matrice qui s'affiche pourtant le client affiche bien le message après la réception par le serveur (toutes les 30 secondes), à croire qu'il recoit bien quelque chose mais qu'il ne modifie pas l'objet en conséquence.
    Je présume qu'il s'agit d'un problème de référence mais je ne vois pas bien où il se situe...
    Comme vous pouvez le voir j'ai testé l'envoie d'une chaine de caractère qui s'incrémente de 1, et là par contre l'envoi fonctionne!

    Je vois vraiment pas le pb! :s
    Une idée?
    Linio

  2. #2
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    Utilise un seul writeObject () pour ton code côté serveur, c'est mieux !
    Et peut-être ça résout ton pb !
    Sinon y a koi dans le liste.get(i) ?

  3. #3
    Membre averti Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Points : 332
    Points
    332
    Par défaut
    J'utilise un seul writeObject ()
    La liste est en fait un vector de mes ObjectOutputStream de tous les clients.
    Je pourrais mettre le code entier des deux classes mais c'est un peu long, je voudrais pas abuser.
    Linio

  4. #4
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    liste.get(i).writeObject(matrix);
    liste.get(i).flush();
    /*
    liste.get(i).writeObject(new String("Ceci est le message!"+K));
    liste.get(i).flush();
    pour moi tu l'as utilisé 2x writeObject essaie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    liste.get(i).writeObject(new String(matrix+"\r\nCeci est le message!"+K)); 
    liste.get(i).flush();

  5. #5
    Membre averti Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Points : 332
    Points
    332
    Par défaut
    Mais c'est commenté!
    C'était juste un test pour voir si ça marchait, et la chaine elle passe bien alors que la matrice non...
    Linio

  6. #6
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    ben ça vient de matice alors !?

    Fais voir ton liste.get() alors.

    PS : écrire les commentaires dans une soucre pour ce forum, c'est pas top, car c'est pas très lisible !!

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Est-ce que la classe de "matrix" implémente java.io.Serializable ?
    Si non, ça peut expliquer le problème...
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    Points : 100
    Points
    100
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    matrix.setProduction();
    Ca fait quoi ?

  9. #9
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut
    in est un objet de quel type?
    Colère et Haine mènent à la Puissance

  10. #10
    Membre averti Avatar de soad
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 520
    Points : 439
    Points
    439
    Par défaut
    j'ai déjà eu ce problème et apparemment c'est un bug de java, comme si l'objet recu ne remplacais pas l'ancien !!!

    la seule solution que j'ai trouvé pour résoudre se problème est de créer un nouvelle objet du coter serveur avant de l'envoyer !

  11. #11
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    En même temps c'est peut-être un comportement normal : c'est le même objet côté serveur, seul son état change. Alors côté client la désérialisation ne va pas trop chercher à comprendre => elle reprend directos l'objet préexistant qui a été désérialisé lors du 1er appel sans mettre son état à jour.

    M'enfin ca c'est mon idée à moi j'ai pas essayé. Pas moyen de bidouiller la méthode readObject() ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  12. #12
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    Je doute formement d'un bug java !!
    Je pense qu'il faudrait que tu montre le détail des autres classes. On dirait que tu lances plusieurs threads les uns sur les autres...

  13. #13
    Membre averti Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Points : 332
    Points
    332
    Par défaut
    J'ai essayé déjà de faire un clone, ça n'a pas trop marché...
    Mais bon je suis pas un pro du clonage donc...
    Je mettrais le listing complet de mes classes dès que je rentre...
    Y'a t'il un moyen de savoir la référence d'un objet?
    Parce que si elle est identique, effectivement le problème vient de la conservation de l'objet...
    J'essaierais ça en rentrant, et je posterais ici.
    Merci pour vos réponses.

    Pour des réponses:
    in est un objet de type ObjectInputStream (du client)
    liste contient des ObjectOutputStream (des clients)
    matrix.setProduction est juste une fonction qui modifie l'objet matrix.
    Linio

  14. #14
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut
    System.out.println(""+obj);

    (en espérant que ton objet n'a pas de méthode toString();
    Colère et Haine mènent à la Puissance

  15. #15
    Membre averti Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Points : 332
    Points
    332
    Par défaut
    Mon objet a une méthode toString() (comme beaucoup d'ailleurs...)
    J'essaierais de la remplacer par un super() pour tester.
    Linio

  16. #16
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Pas moyen d'utiliser RMI ? Comme ca le serveur partage directement sa matrice avec chacun de ses clients et n'a pas à la re-sérialiser à chaque changement. Plus de pb lors de la mise-à-jours des données (tout le monde à accès à la même matrice mise-à-jour).

    Evidement il faudra quand même faire un cache/proxy des données côté client car si le client fait souvent des requêtes sur les données de la matrice ca risque d'être un poil lent (puisque chaque appel fera un aller-retour à travers le réseau).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  17. #17
    Membre averti Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Points : 332
    Points
    332
    Par défaut
    Oh combien de fois j'ai entendu ça...
    Pas moyen d'utiliser RMI.
    Je sais que c'est bien mieux, bien plus simple mais...
    A quoi bon faire simple quand on peut faire compliqué?
    (L'exercice de style même si à caractère ludique a aussi un but éducatif)
    Linio

  18. #18
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Rien de compliqué.
    Tu cherches une solution à ton pb et c'en est une.

    Dans ce cas fait comme il a été dit précédement : modifie ton serveur pour que celui-ci crée à chaque fois une nouvelle instance de la matrice (au niveau du matrix.setProduction();) avant de la sérialiser plutot que de réutiliser toujours la même pour chaque run. Ca devrait régler le pb.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  19. #19
    Membre averti Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Points : 332
    Points
    332
    Par défaut
    Un truc de ce style?

    Classe Matrice:

    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
    45
    46
    47
    48
    49
    50
    51
    public class Matrice implements Serializable,Cloneable{
     
        static private Random generateur = new Random();
     
        private class Data implements Serializable,Cloneable{
            boolean empty = true;
            int player = 0;
            int nbShips;
            int prodShips;
     
            public Object clone() {
                Object o = null;
                try {
                    o = super.clone();
                } catch(CloneNotSupportedException e) {
                    System.err.println("Objet non clonable");
                }
                return o;
            }
     
        }
     
        Data matrix[][] = new Data[20][20];
     
        /** Creates a new instance of Matrice */
        public Matrice() {
            for (int i=0;i<20;i++)
                for (int j=0;j<20;j++)
                    matrix[i][j] = new Data();
        }
     
    public Matrice setProduction(){
     
            for (int i=0;i<20;i++)
                for (int j=0;j<20;j++)
                    if (!matrix[i][j].empty)
                    {
                        System.out.println("[Matrice]Up");
                        matrix[i][j].nbShips += matrix[i][j].prodShips;
                    }
        }
     
    public Object clone() {
            Object o = null;
            try {
                o = super.clone();
            } catch(CloneNotSupportedException e) {
                System.err.println("Objet non clonable");
            }
            return o;
      }
    Classe 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
    public void run(){
            System.out.println("Thread d'envoi démarré");
            while (active)
                try{
     
                    Matrice toSend = matrix.setProduction();
                    System.out.println("Envoi des données:"+toSend);
                    for (int i=0; i<nbSockets;i++)
                    {
                        System.out.println("[Serveur] ");
                        liste.get(i).writeObject(toSend);
                        liste.get(i).flush();
                    }
                    sleep(20000);
     
                }
                catch(Exception e){
                    System.err.println("Erreur lors de l'envoi "+e);
                }
     
            }
    Parce que ça ne marche pas mieux...
    Et de fait je ne comprends pas comment le fait de cloner une classe du côté serveur se répercute sur le client, c'est assez étrange comme fonctionnement...!!??
    Linio

  20. #20
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    une idée, tu n'aurais pas par hasard déclarée une variable d'instance :
    public Matrice toSend;
    dans ta classe serveur ? dans ce cas il y aurait un masquage de la variable... :

    Où initialises-tu Matrice ?

Discussions similaires

  1. Problème de communication par socket
    Par FabaCoeur dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 22/06/2010, 10h00
  2. Réponses: 5
    Dernier message: 29/03/2007, 22h26
  3. Communication par socket
    Par cybermarcel dans le forum Ruby
    Réponses: 5
    Dernier message: 14/01/2007, 23h08
  4. Problème de communication par socket
    Par odjosc dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 20/06/2006, 14h57
  5. [Omnis] Communication par Socket
    Par y0p dans le forum WinDev
    Réponses: 4
    Dernier message: 15/06/2006, 09h02

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