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

Langage Java Discussion :

Comment passer un ENUM à travers un Socket ?


Sujet :

Langage Java

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 52
    Par défaut Comment passer un ENUM à travers un Socket ?
    Bien l'bonjour à tous,

    Dans Eclipse je teste 2 projets simultanément (1 Client, 1 Serveur).

    Le Client doit envoyer au Serveur une information de type ENUM (Bonjour | Aurevoir) selon le bouton sur lequel je clique.

    Le Client utilise ObjectOutputStream.writeObject(MonENUM.Bonjour) et balance dans Socket.
    Le Serveur utilise ObjectInputStream.readObject() pour lire le Socket.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    W/System.err(343): java.io.StreamCorruptedException
    W/System.err(343): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1707)
    W/System.err(343): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1660)
    W/System.err(343): at com.jBidouille.Tablet.OutgoingControl.run(OutgoingControl.java:36)
    W/System.err(343): at java.lang.Thread.run(Thread.java:1096)
    J'ai crée le même objet ENUM dans chaque projet, mais j'ai le sentiment que ce n'est pas ainsi qu'il faut procéder...!!!???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    package com.jBidouille.Tablet;
     
    public enum ControlType {
      PLAY, STOP, PAUSE,FORWARD, BACKWARD;
    }
    Une petite idée !?

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 098
    Par défaut
    Tu px utiliser ordinal() ou name() de l'énumération pour le passer dans la socket. (donc int ou string).

    Après, Je ne sais pas si un enum peut passer d'une autre manière.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 52
    Par défaut
    Oui mais du coup, cela perd tout son intérêt de passer un ENUM

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par elmaestro Voir le message
    Oui mais du coup, cela perd tout son intérêt de passer un ENUM
    ?? Depuis quand ? Un Enum ce n'est pas un truc pour gérer la communication entre deux machines, c'est pour restreindre les valeurs possibles d'un type de données à l'intérieur du programme (et pas à l'extérieur, donc, ce qui est tout bonnement impossible.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    tu peux parfaitement passer une instance d'enum sur un flot d'objet: si les deux classes sont vues des deux cotés avec la même version il n'y a pas de problème.
    StreamCorrupted exception c'est plutot que tu as des constructions de flots qui sont dysymétriques. Tu es bien sûr que tes sockets de chaque coté ont l'intention de s'envoyer et de lire la même chose? ça n'en a pas l'air.
    (oops :edit, j'avais pas vu que c'était sur l'outputstream ... extrèmement étrange! re-edit: c'est bufferisé ou non?)

    @Thelvin : pour une fois pas d'accord avec toi.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par professeur shadoko Voir le message
    @Thelvin : pour une fois pas d'accord avec toi.
    Parce qu'on ne parle pas de la même chose. Certes, passer des Enums à la sérialisation marche sans problème. Mais l'intérêt des enums n'est absolument pas là. Ils ne servent pas spécialement à grand-chose dans ce contexte, et sont la même chose que juste leur ordinal(), à peu de choses près, dont aucune intéressante.

    Citation Envoyé par professeur shadoko Voir le message
    J'ai crée le même objet ENUM dans chaque projet, mais j'ai le sentiment que ce n'est pas ainsi qu'il faut procéder...!!!???
    Tout à fait. Il ne faut pas "créer le même objet Enum", il faut que les deux projets partagent la même classe Enum.
    Ta classe Enum est créée avec un fichier .java (compilé en .class). Eh bien tes deux projets doivent utiliser le même fichier .java (et donc le même .class), pas le refaire chacun de leur côté. C'est un fichier qui doit être commun aux deux projets.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 52
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Tout à fait. Il ne faut pas "créer le même objet Enum", il faut que les deux projets partagent la même classe Enum...C'est un fichier qui doit être commun aux deux projets.
    En fait j'ai créer dans Projet1, une classe MonEnum.java et dans Projet2 une autre classe MonEnum.java.

    Faut-il que je mette MonEnum.java dans un jar et que Projet1 et Projet2 y fassent référence ?

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    c'est le plus propre, oui. Toutes les classes partagées entre tes deux projets (classes servant à la communication) doivent être les memes.

    Maintenant ton erreur n'a rien à voir, c'est plutot comme déjà dit, que tu n'écrit et ne lit pas les même chose -> faudrait de chaque coté le code depuis le début du stream jusqu'à l'erreur

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 52
    Par défaut


    Je vais tout casser...ça fait 2 heures que j'essaye mais sans succès.

    Désolé j'ai pas gardé les logs précis, mais ça disait à peu près ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    java.lang.NoClassDefFoundError
    VFY: unable to resolve static field
    J'ai pourtant crée un .jar à partir d'un 3ème projet qui contient le fameux ENUM, et j'ai référencé ce jar dans Projet1 et Projet2, mais ça crash

  10. #10
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par elmaestro Voir le message
    Désolé j'ai pas gardé les logs précis, mais ça disait à peu près ceci :
    Désolé mais si on n'a pas ni les messages d'erreur ni le code, on va pas pouvoir t'aider

  11. #11
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 52
    Par défaut
    Normal, je remonte l'environement demain pour regenerer les exceptions et avec le bout de code qui crée ce désordre!

  12. #12
    Membre Expert
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Par défaut
    j'ai pas essayé mais ton Enum ne doit elle pas être Serializable ?

    peut-être une piste ici :
    http://docs.oracle.com/javase/1.5.0/...arch.html#6469

    ou encore ici :
    http://www.vineetmanohar.com/2010/01...ze-java-enums/

  13. #13
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Parce qu'on ne parle pas de la même chose. Certes, passer des Enums à la sérialisation marche sans problème. Mais l'intérêt des enums n'est absolument pas là. Ils ne servent pas spécialement à grand-chose dans ce contexte, et sont la même chose que juste leur ordinal(), à peu de choses près, dont aucune intéressante.
    .
    toujours pas d'accord: un enum peut servir comme élément de protocole . bien sûr c'est juste l'ordinal qui est passé, mais d'un point de vue clarté du protocole c'est pas mal du tout. Les deux parties se comprennent sur cette base sans descendre au bas niveau de l'implantation.
    Pour revenir au sujet les enums sont Serializable donc pas de pb de ce coté là.

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

Discussions similaires

  1. comment passer un paramètre a un serveur de socket
    Par orobin dans le forum Silverlight
    Réponses: 4
    Dernier message: 16/09/2008, 22h06
  2. Comment passer un objet à travers le scope session ?
    Par verbose dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 08/02/2008, 12h12
  3. Routeur, comment passer en travers ?
    Par Archaoniro dans le forum Delphi
    Réponses: 19
    Dernier message: 21/08/2006, 04h00
  4. comment passer de access à MySQL
    Par isa_21 dans le forum Requêtes
    Réponses: 4
    Dernier message: 06/10/2004, 08h51
  5. Comment passer sous Delphi ?
    Par J-P-B dans le forum XMLRAD
    Réponses: 2
    Dernier message: 13/06/2003, 10h09

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