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 :

Socket : perte données reception


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 51
    Points
    51
    Par défaut Socket : perte données reception
    Bonjour,

    Comment faire en sorte que les données transférées via une socket arrivent tous de l'autre coté et soient bien lues. je m'explique, j'envoie des données d'un coté vers un autre et dans la partie réception, il attaque à me lire seulement les infos à partir du 40 ème "byte"... ou plus.

    Donc j'envoie et j'ai une perte des données dans la partie reception.

    Que faire ?

  2. #2
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 575
    Points : 15 546
    Points
    15 546
    Par défaut
    Avoir une perte de données n'est pas normal.

    Mais il faudrait que tu précises d'avantage ce que tu envoies et comment pour que l'on puisse t'aider. Si possible postes le code incriminé.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 51
    Points
    51
    Par défaut
    En fait j'ai un InputStream contenant mes données. Je récupère la taille mon inputStream et je la convertis en string avant de l'envoyer en utilisant une socket.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    OutputStream out = socket.getoutputStream()
    out.write(StringFileSize.getBytes());
    Ensuite, tant que mon flux n'est pas vide, je lis mes données dans le buffer. Je place le contenu de mon buffer sur le flux de sortie.

    A la fin j'envoie un end pour signaler la fin et je ferme tout.



    De l'autre coté, j'écoute sur le port concerné. je reçois le nombre envoyé. je crée un tableau de "bytes". Pour l'ensemble des bytes reçus, je place les données dans le tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            for(int i=0;i<nb;i++)
            {
                int value =plec.read();
                tableaBytes[i]=(byte)value;
     
            }

  4. #4
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 575
    Points : 15 546
    Points
    15 546
    Par défaut
    Ta chaine de caractères fait elle bien moins de 127 caractères?
    Car contrairement a ce que laisse penser le prototype de la fonction OuputStream.write(int b), elle ne gère que les byte. Les bits de poids fort du int sont ignorés.

    Sinon les bouts de codes que tu as posté me semblent correct. Il faudrait que tu en poste un peu plus(de l'ouverture du flux jusqu'à sa fermeture si possible)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 51
    Points
    51
    Par défaut
    ah non pas vraiment! Elle en fait plus que ça!

    voila le code d'envoi des données

    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
    55
     
            //Placement de mes données (fichier) directement dans mon flux d'entrée
            //en commencant par la signature
            ByteArrayInputStream in = new ByteArrayInputStream(dataSignature);
     
            //Socket  => flux de sortie
            OutputStream out = socket.getOutputStream();
     
            //utilisation d'un buffer d'une taille fixe
            byte[] buffer=new byte[128];
     
            //
            int nbDataRead;
     
            //recuperation de la taille du flux (taille du fichier)
            int FileSize = in.available();
     
            //Conversion de cette taille en string
            String StringFileSize = Integer.toString(FileSize);
     
            //Integration d'un separateur de données
            //pour marquer la fin de la taille du fichier transmis
            StringFileSize=StringFileSize+"FIN";
     
            //Envoi de la taille via la socket
            out.write(StringFileSize.getBytes());
     
            //affichage
            System.out.println("Envoi taille =>"+StringFileSize);
     
            //tant que des données sont dispo
            while(in.available()!=0)
            {
     
                //Taille des Données lues
                nbDataRead=in.read(buffer);
     
                        System.out.println("Contenu du buffer =>");
     
                        for(int i=0;i<buffer.length;i++)
                        {
                                 System.out.println("Buffer:"+i+"==>>"+buffer[i]);
                        }
     
                //rempli mon buffer
                out.write(buffer,0,nbDataRead);
     
            }
     
            PrintWriter pred = new PrintWriter(new BufferedWriter(new OutputStreamWriter(out)));
     
            pred.print("END");
     
            pred.close();
            socket.close();

    et celui de reception des données

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
            //flux entrée
            BufferedReader plec = new BufferedReader(new InputStreamReader(socket.getInputStream()));
     
            //
            byte[] buffer = new byte[128];
     
            //
            int count;
     
            //Recuperation du nombre de bytes envoyés
            String obtainString = plec.readLine();
     
            //decoupage selon le mot FIN
            //ex:=>tailleFINreste de la chaine
            String[] StringSizeFile = obtainString.split("FIN");
     
            //Conversion en entier
            int nb=Integer.parseInt(StringSizeFile[0]);
     
            System.out.println("chaine reçue =>"+StringSizeFile[0]);
            StringSizeFile=null;
            obtainString=null;
            System.out.println("Chaine convertie en entier =>"+nb);
     
            //Buffer de taille du fichier
            byte[] bufferFile = new byte[nb];
     
            //Integration des données octet/octet dans mon buffer
            for(int i=0;i<nb;i++)
            {
                int o =plec.read();
                bufferFile[i]=(byte)o;
     
            }
     
            //Suppression de la partie "END"
            int id = deleteEndData(bufferFile);
            System.out.println("Id : "+id);
     
            //Suppression des informations inutiles
            byte[] bufFile=deleteInformation(bufferFile,id);
     
            System.out.println("BufferSize : "+bufFile.length);
     
     
            //Affichage du buffer
            for(int j=0;j<bufFile.length;j++)
            {
                //affichage des données
                System.out.println("Buffer="+j+"=> "+bufFile[j]);
            }
     
    //test sous forme de fichier en reception
            FileOutputStream fichier = new FileOutputStream("C:/Users/testInterface/ok");
            fichier.write(bufFile);
            fichier.close();
     
            //Fermeture de la scoket
            socket.close();
     
            //temporairement
            ReceivedData=null;

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/10/2008, 22h31
  2. Problème sockets perte de connexion
    Par jabadao dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 07/11/2007, 15h31
  3. crash mysql et perte données
    Par warl dans le forum Requêtes
    Réponses: 9
    Dernier message: 04/07/2006, 17h10
  4. [Socket]Transfert données + fichier
    Par willowII dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 17/08/2005, 23h08
  5. [UDP][Socket] perte de paquets et arret d'ecoute sur port
    Par Guismo1979 dans le forum Développement
    Réponses: 6
    Dernier message: 02/01/2003, 12h13

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