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 :

Transfert de fichiers par socket


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 117
    Points : 62
    Points
    62
    Par défaut Transfert de fichiers par socket
    Bonjour,

    Je commence tous juste à utiliser les sockets et les IO en java. Je voudrais pouvoir trasférer un fichier de n'importe quel type, à partir d'un client vers un serveur. Mais je n'arrive pas à comprendre le mecanisme à utiliser. J'ai à peu prés compris comment il fallais faire pour des caractéres et chaines, mais là pour les File ou File(In/Out)putStream, je bloque.
    J'ai parcourus de nombreuses pages et nombreaux forum sans trouver la réponse à ma question, donc si quelqu'un pouvait m'expliquer, merci d'avance !

  2. #2
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Pour envoyer :
    Tu créer une FileInputStream, tu lui ajoute par dessus un BufferedInputStream.
    Tu utilises la méthode read de ce dernier pour lire les octets (read retournera -1 lorsque la fin de fichier sera atteinte).
    En parallèle : tu récupère d'outputStream de la Socket sur lequel tu ajuotera un BufferOutputStream.
    Tu envois les octets lus précédement dans ce bufferedOutputStream.

    Enfin pour la réception, ça marche de la même facon sauf que c'est inversé : BufferedInputStream sur InputStream de la socket et BufferedOUtputStream sur le FileOutputStream du fichier à écrire.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 117
    Points : 62
    Points
    62
    Par défaut
    Alors d'aprés ce que j'ai compris je fais ça a peu prés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    FileInputStream file = new FileInputStream("ici.mp3");
     	BufferedInputStream fileBuffer = new BufferedInputStream(f);
     	BufferedOutputStream bufferEnvoi = new BufferedOutputStream(socket.getOutputStream());
     	//On envoie les octets
    Mais je ne vois pas comment envoyer ces octets dans le flux, peut etre avec une boucle type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(fileBuffer.read() != -1)
    {
              bufferEnvoi.write(fileBuffer.read());
    }
    est-ce cela ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 117
    Points : 62
    Points
    62
    Par défaut
    Merci pour ta réponse, je viens d'y arriver et j'ai compris le fonctionnement.
    Il faut rajouter cette boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //transmet l'octet lu dans le tampon contenant le FileInputStream
    //dans le tampon contenant la methode getOutputStream() de la socket
    int octet = 0;
    		while (octet != -1 ) 
    		{
     			octet = fenvoi.read();
     			fr.write(octet);
    		}
    J'ai vu qu'il était possible de faire ce traitement en découpant le fichier en bloc de bytes, pourriez vous m'expliquer l'intérêt et me donner un exemple tout bête de trasfert par bloc s'il vous plait ?
    Merci

  5. #5
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Plutôt que d'envoyer les octets un par un, tu utilises un buffer (byte [] buffer=new byte[tailleBuffer]). les méthodes read et write acceptent byte [] en paramètre.
    Historiquement, la lecture par blocs allaient beaucoup plus vite qu'octet par octet (et évitait d'user prématurément les disques). Aujourd'hui avec les différents caches (JVM, OS, Disque), je doute qu'il y ait de vrai gain de performance (a tester). Par contre depuis que les caches disque existent, plus d'usure prématurée du disque.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 117
    Points : 62
    Points
    62
    Par défaut
    Merci beaucoup pour vos reponse, je comprends maintenant.

  7. #7
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par iohack Voir le message
    Plutôt que d'envoyer les octets un par un, tu utilises un buffer (byte [] buffer=new byte[tailleBuffer]). les méthodes read et write acceptent byte [] en paramètre.
    Historiquement, la lecture par blocs allaient beaucoup plus vite qu'octet par octet (et évitait d'user prématurément les disques). Aujourd'hui avec les différents caches (JVM, OS, Disque), je doute qu'il y ait de vrai gain de performance (a tester). Par contre depuis que les caches disque existent, plus d'usure prématurée du disque.
    En fait, les appels systèmes réseau sont très lents (même les appels système de bases aux fichiers), mais comme il utilise des BufferedOutputStream et BufferedInputStream, il n'y a pas trop de problème (même si passer directement un byte[] évite des appels inutiles)
    Je ne répondrai à aucune question technique en privé

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

Discussions similaires

  1. Transfert de fichier par socket client vers client
    Par Dasson dans le forum Entrée/Sortie
    Réponses: 21
    Dernier message: 17/04/2012, 02h26
  2. Transfert fichier par socket
    Par allserv dans le forum Réseau
    Réponses: 1
    Dernier message: 21/10/2008, 16h30
  3. Réponses: 17
    Dernier message: 15/05/2007, 18h35
  4. Transfert de fichiers par sockets
    Par Kaori dans le forum C++
    Réponses: 19
    Dernier message: 26/01/2005, 13h58
  5. Transfert de fichier par ftp
    Par schub1015 dans le forum MFC
    Réponses: 3
    Dernier message: 14/01/2004, 17h53

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