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 :

Passage d'un entier dans un stream


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Par défaut Passage d'un entier dans un stream
    Bonjour à tous,

    J'envoie des objets entre une classe cliente et une classe serveur via des ObjectIntput/OutputStream. Tout se passe bien, mais pas pour les entiers...

    Voici le bout de code côté client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Socket s = new Socket("127.0.0.1",port_creation);
    ObjectInputStream in = new ObjectInputStream(s.getInputStream());
     
    int correct = in.read();
    System.out.println(correct);
    ... Et du côté Serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); 
    int correct = -1;
    out.write(correct);
    En sachant qu'il n'y a aucun problème pour le transfert d'objets (j'utilise les méthodes out.writeObject(monObjet); et monObjet = in.readObjet(); .

    Je vois pas où ça va pas. Si vous pouviez m'aider ce serait un sérieux coup de pouce.

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Alors transmet un Integer au lieu d'un int
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Par défaut
    Merci pour la réponse, j'ai essayé et voilà ce que ça a donné :

    dans le code serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System.out.println(correct);
    out.writeObject(correct);
    Cela me donne la valeur 1 affichée dans la console,

    dans le client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Integer correct = (Integer) in.read();
    System.out.println(correct);
    Ce qui m'affiche -1... Dans le code serveur, la variable correct est initialisée à -1, puis passée à 1 ou 0 selon les résultats des tests effectués. En l'occurence, le test fait passer la variable à 1 (vu que je l'affiche avant de l'envoyer)...

    Que puis-je faire pour résoudre mon problème ?

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Côté serveur, tu transmets quoi ? Un int ou un Integer ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre très actif Avatar de unknow0
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 452
    Par défaut
    Bonjour,

    les method read() et write ecrive un octet et non un entier.
    pour ecrire des int utilise plutot les method writeInt et readInt

    Cordialement

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Par défaut
    dinobogan :

    J'envoie un Integer.


    unknow0 :

    Oh merci beaucoup ! Je vais essayer sur le champ. Mais dans la javadoc, c'est écrit que la valeur retournée par read() est un int... Mais je vais voir ça !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Par défaut
    Ca a pas l'air de marcher... Le programme bloque au débugguage lorsque le serveur écrit l'entier. Le client reste sur la lecture en attendant l'entier, alors que le serveur considère que tout s'est bien passé et essaye d'executer les étapes suivantes (le client est sensé envoyer au serveur une chaine, et le serveur est bloqué sur la lecture).


    Code coté serveur :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /*R*/String reponse = (String) in.readObject();
    int correct = -1;
    try{Manager.valider(reponse, ids.getNom(), ids.getPrenom(), ids.getId());correct = 1;}
    catch(ReponseIncorrecteException a){correct = 0;}
    finally{
    System.out.println(correct);
    /*W*/out.writeInt(correct);
    	}
    Code coté client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String reponse = Keyboard.readString();
    /*W*/out.writeObject(reponse_secrete);
    /*R*/int correct = in.readInt();

  8. #8
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    Citation Envoyé par wizzy Voir le message
    Mais dans la javadoc, c'est écrit que la valeur retournée par read() est un int...
    La javadoc dit surtout que cette fonction lit un octet de données ("Reads a byte of data.").

    Le même souci a été posté il y a à peine neuf jours. Le titre du topic était d'ailleurs pour le coup tellement explicite ("[Socket] Simple envoie d'entiers") que j'ai du mal à croire qu'une recherche sur le forum ne t'aie pas retourné ce topic.

  9. #9
    Membre très actif Avatar de unknow0
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 452
    Par défaut
    oui read retourne bien un int mais il et dit dans la javadoc aussi:
    int read()
    Reads a byte of data.
    c'est donc bien un octet qui et lut

    humm pour ton probleme de bloquage la je vois pas :s

    a si tu a bien flusher le stream?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Par défaut
    Ok.

    Je dois faire un in.flush() sur le client avant de recevoir ainsi qu'un out.flush() sur le serveur avant d'envoyer c'est ça ?

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Par défaut
    Citation Envoyé par nouknouk Voir le message
    La javadoc dit surtout que cette fonction lit un octet de données ("Reads a byte of data.").

    Le même souci a été posté il y a à peine neuf jours. Le titre du topic était d'ailleurs pour le coup tellement explicite ("[Socket] Simple envoie d'entiers") que j'ai du mal à croire qu'une recherche sur le forum ne t'aie pas retourné ce topic.
    Bah dans la solution proposée, c'est avec un BufferedReader qu'il s'en sort. Je comprend pas pourquoi je suis obligé de passer par un BufferedReader pour transférer un entier... Pourquoi je peux pas l'envoyer tout simplement par un OutPutStream directement, surtout que je peux envoyer tout autre objet par ce biais ?

  12. #12
    Membre très actif Avatar de unknow0
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 452
    Par défaut
    oula pas de in.flush()
    un out.flush() seulement

    et il n'y a pas besoin de passer par un bufferedreader pour envoyer des int j'y arrive tres bien avec des Data/objectinput/outputStream

    et su tu veux utiliser des input/outputStream tout simple tu doit toi meme convertir tes donner en tableux de byte ce qui et un peu contraignant (surtout que les data/objet stream le font deja)

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Par défaut
    Bon ça marche toujours pas. J'y vais avec un objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class MonInteger implements Serializable {
    static private final long serialVersionUID = 15L;
    private int value;
    public MonInteger(int v){
    	value = v;
    }
    public int getValue(){
    	return value;
    }
    }
    et je change mes readInt() et writeInt() en readObject() et writeObject(). Ca marche bien mais c'est crade. Faute de temps je laisse comme ça pour les tests je verrai pour des corrections éventuelles plus tard. Merci à tous pour vos réponses, à bientôt.

  14. #14
    Membre très actif Avatar de unknow0
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 452
    Par défaut
    bizarre :s

    tu sais tu n'avais pas a reecrire une class pour l'envoyer Integer et serializable il me semble.

    mais c'est quand meme etrange que writeInt ne marche pas :s

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Par défaut
    Oui mais ça ne fonctionne ni avec int (utilisé avec readInt et writeInt) ni avec Integer (avec readObject et writeObject). Je ne comprend pas non plus, y a sans doute une explication qui serait que j'ai fait une erreur de synthaxe idiote quelque part, mais je ne la vois pas.

  16. #16
    Membre très actif Avatar de unknow0
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 452
    Par défaut
    arf oui en effet la il doit y avoir une erreur quelleque par mais dans les bout de code que tu a poster je n'en vois pas non plus (a par le out.flush())
    donc bon courage pour la suite

Discussions similaires

  1. Sélectionner tous les entiers dans une fourchette
    Par ludo.guy dans le forum Langage SQL
    Réponses: 5
    Dernier message: 16/07/2004, 09h15
  2. Réponses: 4
    Dernier message: 23/06/2004, 09h51
  3. [MFC] Passage d'une structure dans une method
    Par KPitN dans le forum MFC
    Réponses: 5
    Dernier message: 18/06/2004, 10h11
  4. [XSL] Tester si la valeur est un entier dans un xml
    Par MrMaze dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 23/07/2003, 04h35
  5. [VB6]Passage d'un tableau dans une DLL écrite en delphi
    Par flash dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 20/09/2002, 10h15

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