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

C# Discussion :

Envoie Fichier par socket


Sujet :

C#

  1. #1
    Invité
    Invité(e)
    Par défaut Envoie Fichier par socket
    Bonjour, je mets en place un programme permettant l'envoie d'un fichier à traver le reseau (TCP). J'utiliser tcpclient...
    Pour le moment, je tester l'envoie sur des fichiers pdf de 5mo environ. Par la suite, l'application devra gérer tout type de fichier...
    Le fichier est situé sur le client, on l'envoie sur le serveur.
    Je vous met une capture de code concernant la reception du fichier coté serveur. Aprés test, je reçois bien mon pdf, mais (y'en a tjrs un lol), celui est rajouté de quelques octects en plus...mais j'arrive à l'ouvrir et le consulter...
    PDF Original: 4.76Mo
    PDF Envoyé: 5Mo...

    J'envoie par paquet de 1 mo...
    J'ai bien reussi à faire l'envoi octet par octet, mais cela prends trop de temps...

    Bref je ne comprends pourquoi le fichier copié est rajouté de quelques octets en plus...

    Je débute en C#, je demande votre négligence
    Merci à ceux qui m'aideront.


    Code coté Serveur (reception du fichier)

    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
     class Program {
            static readonly ushort port = 50000;
            static void Main(string[] args) {
     
                IPAddress ipAddress = new IPAddress(new byte[] { 127, 0, 0, 1 });
                TcpListener tcpL = new TcpListener(ipAddress, port);
                tcpL.Start();
     
                Console.WriteLine("Attente de connexion client");
                TcpClient tcpC = tcpL.AcceptTcpClient();
                Console.WriteLine("Client connecté");
                NetworkStream network = tcpC.GetStream();
                BinaryReader lecture = new BinaryReader(network);
                FileStream fileSend = new FileStream("C:\\temp\\" + "file" + ".pdf", FileMode.Create, FileAccess.Write, FileShare.None, 10000, true);
                BinaryWriter ecriture = new BinaryWriter(fileSend);
                int packet = 1048576;
                tcpC.ReceiveBufferSize = packet;
                bool End=false;
                int nByteRead=0;
                byte[] block = new byte[packet];
     
               //Je recois les données que j'ecris dans le fichier...
     
                while ((nByteRead = lecture.Read(block, 0, packet)) > 0) {
                    ecriture.Write(block, 0, packet);
                }
                network .Close();
                ecriture.Close();
                lecture.Close();
                Console.WriteLine("Client deconnectée");
            }
        }
    }

    Code coté Client (Envoie du fichier)

    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
    class ProgClient {
            static readonly string host = "localhost";
            static readonly ushort port = 50000;
     
            public void Envoie(String source) {
     
                int packet = 1048576;
                TcpClient tcpC = new TcpClient(host, port);
                NetworkStream net = tcpC.GetStream();
                tcpC.SendBufferSize = packet;
                BinaryWriter ecriture = new BinaryWriter(net);
                FileStream fileToSend = new FileStream(source, FileMode.Open, FileAccess.Read, FileShare.Read);
                BinaryReader lecture = new BinaryReader(fileToSend);
                long TailleFichier = fileToSend.Length;
                int refer = 0;
     
                while (refer<TailleFichier) {
                    byte[] block = new byte[packet];
                    int nbLu = lecture.Read(block, 0, packet);
                    ecriture.Write(block, 0, packet);
                    refer += nbLu;
                }
     
                net.Close();
                ecriture.Close();
                lecture.Close();
            }
        }
    Dernière modification par Invité ; 26/02/2008 à 17h56. Motif: Ajout du code côté client

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    Salut

    du coté client, plutot que de faire :

    ecriture.Write(block, 0, packet);

    tu devrais faire :

    ecriture.Write(block, 0, nbByte Read);

    car à la fin, tu n'a pas 1mo, mais moins et comme tu ecris 1mO, c'est l'explication logique à ton problème

    Il te faut ajouter à Ecriture le nombre d'octet recu (meme si tu essayes de lire un buffer de xxx octets...)

    The Monz, Toulouse

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut, je te remercie pour ta réponse.
    C'est vrai qu'il n'est pas bête de faire lire le nombre d'octet lu par lecture.
    Je vais tester ceci

    Edit:

    Alors j'ai modifié de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                while (refer<TailleFichier) {
                    byte[] block = new byte[packet];
                    int nbByteRead = lecture.Read(block, 0, packet);
                    ecriture.Write(block, 0, nbByteRead);
                    refer += nbByteRead;
                }

    Mais toujours pareil
    Dernière modification par Invité ; 27/02/2008 à 10h13.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bon j'ai résolu mon problème hier soir en pensant à ça dans mon lit à 1h du mat...

    Il fallait faire de même coté serveur.

    Merci encore à toi

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

Discussions similaires

  1. Envoi de fichier par socket
    Par thebloodyman dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 30/08/2007, 17h07
  2. Envoi de fichier par socket
    Par dr_octopus74 dans le forum Réseau
    Réponses: 42
    Dernier message: 19/01/2007, 17h59
  3. Envoi d'un fichier par socket
    Par Aleksis dans le forum C++
    Réponses: 12
    Dernier message: 12/08/2006, 05h10
  4. Réponses: 3
    Dernier message: 06/03/2006, 10h36
  5. [Débutant] Envoi de fichier par socket
    Par zapho dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 26/05/2004, 18h58

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