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 :

Problème envoi de données et message Client/serveur


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 30
    Points : 20
    Points
    20
    Par défaut Problème envoi de données et message Client/serveur
    Bonjour, je fais une application de stockage de fichiers client/serveur.

    Et j'ai un problème que je ne comprend pas.


    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
     
    //utiliser par la partie cliente
    public static void EnvoiFichier(String nomDeFichier, DataOutputStream outToServeur,BufferedReader inS) throws IOException, InterruptedException {
    			RandomAccessFile fic = null;
    			fic = new RandomAccessFile (nomDeFichier,"r");
    			byte[] buffer_send = new byte[1024]; // buffer de lecture dans le fichier
    		    int fichierfini = (int)fic.length(); // == 0 lorsque le fichier aura été entièrement envoyé   
    		    while (fichierfini != 0){
    		    	 //System.out.println("taille restante : "+ fic.getFilePointer());
    			     int octets_lus = 0; // nombre d'octets lus
    			     octets_lus = fic.read(buffer_send, 0, buffer_send.length - 4);
    			     if(fichierfini > 1024){
    			    	 System.out.println("taille envoyé : " + buffer_send.length);
    			    	 outToServeur.write(buffer_send); //envoie
    			     }
    			     else if(fichierfini < 1024){
    			    	 System.out.println("taille envoyé : " + fichierfini);
    			    	 System.out.println("Fin fichier LECTURE envoi fichier");
    			    	 outToServeur.write(buffer_send,0,fichierfini);
    			     }
    			     outToServeur.flush();
    			     inS.read(); //attente confirmation
    			     fichierfini = (int) (fic.length() - fic.getFilePointer());
    		    }
    		    outToServeur.write("END".getBytes());
    		    //outToServeur.writeBytes("END");
    		    System.out.println("envoie du END");
    		    outToServeur.flush();
    		    fic.close();
    		}
    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
     
    //utilisé par la partie serveur pour recevoir les fichiers
    public static void ReceptFichier(String nomDeFichier, DataOutputStream sortie, InputStream entree) throws IOException {
    		try{
    			//System.out.println("ouverture du fichier1");
    			RandomAccessFile fluxSortie = new RandomAccessFile(nomDeFichier,"rw");
    			//System.out.println("ouverture du fichier2");
    		    String message = "";
    		    sortie.flush();
    		    while (!message.equals("END")){  
    		    	System.out.println("reception d'une partie");
    		     // Creation d'un tampon de stockage
    		    	byte []buffer_receive = new byte[1024];
    		    	// Lecture du message sur le flux d'entree
    		    	int size_msg = 0;
    		        size_msg = entree.read(buffer_receive, 0, buffer_receive.length); //en attente     
    		        System.out.println("taille reçu : " + size_msg);
    		        if (size_msg >= 0){
    		            message = new String(buffer_receive, 0, size_msg);
    		            System.out.println(message);
    		        }
    		        if (!message.equals("END"))
    		        {
    		         fluxSortie.write(buffer_receive);
    		         sortie.write("OK".getBytes());
    		         System.out.println("pas la fin de fichier");
    		         sortie.flush();  
    		        }
    		        else if (message.equals("END"))
    		        	System.out.println("on est a la fin du fichier END");
    		    }	
    		    System.out.println("Fin de receptfichier : fermeture du fichier");
    		    fluxSortie.close();
    		}
    		catch (Exception e){}
    	}
    En effet, lorsque j'envoie un fichier texte tout se passe bien par contre quand je passe à un fichier plus gros comme une image, le message "END" envoyé par le client est compris dans la dernière partie du fichier que j'envoie (il devrait être envoyer séparément dans le prochain envoi), et je ne vois vraiment pas pourquoi. Par exemple j'envoie 592 bytes dans l'affichage taille reçu j'ai 595 (comprend donc les 3 bytes du "END", mais à la reception
    Pourtant, le "END" est envoyé après la réception d'une confirmation par le serveur. Est ce que vous pourriez m'aider à trouver le problème s'il vous plaît ?

    Edit:
    J'ai reussi à le faire marcher sans trop savoir comment ... J'ai mi un writeBytes à la place d'un write.getBytes pour le "OK" et un readLine ... Mais le problème est cette fois-ci que l'image transférer n'est pas correct, il doit y avoir des pertes de données ? Pourtant tout semble correct pour les textes.
    Merci.

  2. #2
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    octets_lus = fic.read(buffer_send, 0, buffer_send.length - 4);
     
    			    	 outToServeur.write(buffer_send); //envoie
    tu lit buffer_send.length-4 et tu écrit tout le buffer, donc tu lit 1020 octets, mais t'en ecrit 1024, tu "invente" donc 4 octets à chaque boucle.


    Il n'y a pas de notion "d'envoi séparé" sur le outputstream lié à la socket. Peut importe que tu sépare les write ou pas, ca reste un flux continu, et quand tu lit, c'est indépendant de comment tu as écrit. Seul l'ordre des données est garanti.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 30
    Points : 20
    Points
    20
    Par défaut
    je suis bête -_- ...
    par contre mon problème de END dans le buffer revient, je pense que c'est dû à une mauvaise synchronisation de mes read et write.

  4. #4
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    y a pas de problème de END dans le buffer, il est normal que le END soit à la fin des données puisque tu l'envoi à la fin des données. Le flux, c'est continu.

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/02/2015, 17h33
  2. Client/Serveur problème envoi de données
    Par france38 dans le forum Débuter
    Réponses: 0
    Dernier message: 02/05/2011, 10h49
  3. Réponses: 6
    Dernier message: 03/03/2010, 16h54
  4. Socket envoi message Client/Serveur
    Par sebkill dans le forum C#
    Réponses: 27
    Dernier message: 28/05/2008, 22h34
  5. Réponses: 3
    Dernier message: 22/06/2006, 17h41

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