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

Java Discussion :

les entier >127


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Par défaut les entier >127
    bonjour,

    voila mon code client et serveur.
    lorsquej'envoie des numeros <128 au serveur, ils sont lit correctement mais lorsque j'envoie des nombres >127 ils sont recus erronés par le serveur.
    q'est ce que je dois faire

    code 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    package serveur_client;
    import java.net.*;
    import java.io.*;
    public class Client {
    public static void main(String[] args) {
        String host = "xxx.xxx.xxx.xxx";
        int port = 19999;
        System.out.println("Client initialized");
        try {
          InetAddress address = InetAddress.getByName(host);
          Socket connection = new Socket(address, port);
          BufferedOutputStream bos = new BufferedOutputStream(connection.getOutputStream());
          OutputStreamWriter osw = new OutputStreamWriter(bos);
    String ligne;
    BufferedReader IN=null;
    try{IN=new BufferedReader(new InputStreamReader(System.in));}
    catch (Exception e){System.err.println("Erreur : "+e);System.exit(1);}
    System.out.print("Tapez une ligne : ");
    try{
    ligne =IN.readLine();
    int a = Integer.parseInt(ligne);
    System.out.println(a);
    osw.write(a);
    osw.flush();
          InputStreamReader bis = new InputStreamReader(connection.getInputStream());
          BufferedReader isr=new BufferedReader(bis);
          String c = isr.readLine();
          //System.out.println(ligne + " Dinars equiaut à " +c+ " Euro");
          System.out.println(c);
          connection.close();
    }
    catch (Exception e){System.err.println("Erreur : "+e);System.exit(2);}
    }
        catch (IOException f) {System.out.println("IOException: " + f);}
        catch (Exception g) {System.out.println("Exception: " + g);}}}
    code 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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    package serveur_client;
    import java.net.*;
    import java.io.*;
    public class Serveur implements Runnable{
        private Socket connection;
        private int ID;
        public static void main(String[] args){
            int port = 19999;
            int count = 0;
            try{
                ServerSocket socket1 = new ServerSocket(port);
                System.out.println("serveur Initialized");
                while (true){
                    Socket connection = socket1.accept();
                    Runnable runnable = new Serveur(connection, ++count);
                    Thread thread = new Thread(runnable);
                    thread.start();
                }
            }
            catch(Exception e){}
        }
    Serveur(Socket s, int i){
        this.connection = s;
        this.ID = i;
    }
    public void run(){
        try{
        BufferedInputStream is = new BufferedInputStream(connection.getInputStream());
        InputStreamReader isr = new InputStreamReader(is);
        int a = isr.read();
        System.out.println(a);
        System.out.println("conversion de " +a+" Dinars en Euros");
        //System.out.println("treaitement");
        try{
            Thread.sleep(10000);
        }
        catch(Exception e){}
        double returnCode = a*0.57;
        System.out.println(returnCode);
        BufferedOutputStream os = new BufferedOutputStream(connection.getOutputStream());
        OutputStreamWriter osw = new OutputStreamWriter (os);
        String s = Double.toString(returnCode);
        osw.write(s);
        osw.flush();
    }
    catch(Exception e){
    System.out.println(e);
    }
    finally{
        try{connection.close();}
        catch(IOException e){}
    }
    }
    }

    merci d'avance

  2. #2
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    Bonjour,
    je ne fais que des suppositions mais je pense que c'est parce que tu passes par un InputStreamReader, qui lit et convertit des octets en "caractères".
    Un octet tient sur 8 bits et est signé, ce qui lui permet effectivement d'aller de -128 à 127.

    Ton problème est donc de faire comprendre à l'InputStreamReader que l'entier à lire tient sur 4 octets.

    La solution 1 serait d'essayer de spécifier un Charset à ton InputStreamReader, mais ça j'ai jamais fait.

    Sinon moi perso pour échanger des données non binaires je passe plutot par des PrintWriter et BufferedReader, qui permettent d'échanger du texte, ce qui permet de s'affranchir du coté binaire.


    edit: en fait je te conseille pour faire simple de faire l'envoi du nombre au serveur de la même manière que tu traites son retour:
    écris l'entier, puis un retour à la ligne ('\n');
    de l'autre coté, fais un readLine, puis parse la ligne en nombre avec Double.parseDouble() ou Integer.parseInt();

  3. #3
    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
    Tu utilise des writer / reader pour gérer ton flux de données, hors ces classes sont destinées à l'envoi de texte, pas l'envoi de valeurs binaires. Pour envoyer du binaire, soit tu utilise directement les outputStream / inputStream, soit comme le suggère jidefix, tu convertis tes nombres en texte. (Exemple 154 deviendrais "154\n"), soit (méthode que je recommande), tu utilise DataInputStream / DataOutputStream avec les méthodes writeInt() readInt() (et là si t'as aussi du texte a faire passer, il y a les méthodes readUTF/writeUTF.)

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Je vais émettre une autre hypothèse :

    Tu utilises deux OS différents. L'un est de type UNIX, l'autre Windows. Or l'encodage des caractères > 127 n'est pas le même sur UNIX et Windows.

    Tu peux le vérifier en testant ce code sur les deux machines :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println("é : " + (int) 'é');

  5. #5
    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
    le problème de base reste le meme, les writer / reader ne sont pas fait pour l'envoie de donnée binaire. D'ailleur la méthode write(int) est claire à ce sujet:
    "Write a single character The character to be written is contained in the 16 low-order bits of the given integer value; the 16 high-order bits are ignored. "

    Maintenant la manière dont le caractère sera encodé dépend de m'encodage utilisé par le writer.

Discussions similaires

  1. Espace disque alloué pour les entiers
    Par stos dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 30/10/2006, 14h17
  2. fstream >> probleme avec les entiers
    Par Acropole dans le forum SL & STL
    Réponses: 6
    Dernier message: 01/12/2005, 10h36
  3. 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
  4. FormatFloat pour les entiers !?
    Par Lung dans le forum Langage
    Réponses: 5
    Dernier message: 10/04/2003, 15h20

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