[.NET] Transfert de fichier

fdiedler2000
Messages postés
383
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
1 décembre 2008
- 19 mars 2007 à 23:31
ShareVB
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
- 30 mars 2007 à 18:55
Salut tout le monde !

Y'a t-il deja quelqu'un qui a fait un transfert de fichier en VB.NET (version 2003 ou 2005) ??

J'ai jamais trouvé une seule source sur le NET sur l'envoi de ficheir dans une socket en .NET !

Quelqu'un peut-il m'aider à faire cela ?

Merci

23 réponses

ShareVB
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
25
20 mars 2007 à 23:07
salut,

la démarche est la suivante :
-> faire le code pour créer le client et le serveur tcp
-> créer son propre protocole d'envoi de fichier...un truc dans le genre de SEND fichier taille suivi des données binaire du fichier...

ou sinon, ce n'est pas du VB.Net mais du c# :
http://www.csharphelp.com/archives2/archive335.html

ShareVB
0
fdiedler2000
Messages postés
383
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
1 décembre 2008

21 mars 2007 à 13:12
Salut,

Moi j'utilise les sockets et je voulais en savoir plus sur la classe NetWorkStream... Peut ton envoyer un fichier avec ca ?
Si oui comment ?
0
ShareVB
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
25
21 mars 2007 à 13:36
salut,

non, non, NetworkStream ne peut envoyer et recevoir que des bytes, avec l'aide des classes BinaryWriter/BinaryReader ou des chaines avec les classes StreamReader/StreamWriter...

pour ce qui est de l'envoi de fichier regarde ça, c'est la méthode .Net même si le code est C#...
http://www.csharphelp.com/archives2/archive335.html

ShareVB
0
fdiedler2000
Messages postés
383
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
1 décembre 2008

21 mars 2007 à 15:58
Ok oui j'ai regarder la source et puis je l'ai transposer en .NET et puis je fais des tests avec l'envoi des bytes par NetworkStream
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ShareVB
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
25
21 mars 2007 à 16:13
salut,

plus précisément au sujet de NetworkStream : tu peux envoyer les données d'un fichier mais pas le fichier lui-même càd son nom, attributs...pour cela, il faut que tu fasses un protocole d'envoi...

ShareVB
0
fdiedler2000
Messages postés
383
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
1 décembre 2008

21 mars 2007 à 18:50
oui biensur ca va de soi bah j'ai tester avec cette classe et ca marche : Avantage j'utilise plus 2 sockets pour l'envoi mais une seule ! SInon pour la rapidité c'est pareil ^^ T'a pas un moyen pour accélerer les transferts ?
++
0
ShareVB
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
25
21 mars 2007 à 22:35
salut,

à priori, augmenter la taille des paquets (la taille du buffer que tu passes à Write)...suivi d'un flush...je pense que c'est en parti comme ca que l'on limite la bande passante donc pour l'utiliser au max ca doit être pareil...

ShareVB
0
fdiedler2000
Messages postés
383
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
1 décembre 2008

21 mars 2007 à 23:49
ok je l'ai fixé à 4096 ca me parrait bien et si je la met à 1 000 000 ca va faire quoi ? lol
0
ShareVB
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
25
23 mars 2007 à 16:15
salut,

sachant que le MTU de ethernet est pratiquement tjs fixé à 1500, 4096 est suffisant...remarque cela dit que si on met 1M de buffer, ca peut surement ralentir le tout parce que le write est synchrone et attend que les données soit envoyées pour revenir...donc tout est une question de taille adaptée...

ShareVB
0
fdiedler2000
Messages postés
383
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
1 décembre 2008

23 mars 2007 à 18:17
ok sinon avec l'exemple que tu m'avais envoyé
http://www.csharphelp.com/archives2/archive335.html

Tu sais comment on fait pour annuler un transfert ? car si y'a aucune methode avec la classe NetworkStream pour faire ca, c'est vraiment pas pratique ! (cf mon autre post ds ce forum)

Ca fait des heures que je cherche cela !!
0
ShareVB
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
25
23 mars 2007 à 18:30
salut,

méthode propre : FTP, un canal de commande, un canal de données...envoi d'une commande CANCEL sur le canal de commande...

méthode sale : fermer le socket pendant le transfert...par contre, du coup, il faut recommencer le transfert si c'est une liste...

perso, je pense au final que FTP est tout de même le meilleur moyen de transférer des fichiers...sinon il y a aussi un mini ftp : le protocole TFTP...

ShareVB
0
fdiedler2000
Messages postés
383
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
1 décembre 2008

23 mars 2007 à 21:17
Salut,

Un FTP je veux bien lol mais si je me fais chier (desole pour le mot ^^) pour faire ce projet c'est que j'ai un serveur (2 DD de 500Go) remplit completement et donc je vois mal comment je vais uploder 1 TeraOctet de données sur un Ftp ! ;)

.... Sinon toujours bloqué pour mon NetWorkStream et effectivement fermer la socket est une methode "sale".
0
ShareVB
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
25
23 mars 2007 à 21:53
salut,

je voulais simplement dire de faire deux canaux : un pour envoyer les commandes et un pour envoyer les données...le principe du ftp quoi...du coup, envoyer le SEND sur le canal de commande, puis les données sur le canal de données, puis un éventuel CANCEL...

ShareVB
0
fdiedler2000
Messages postés
383
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
1 décembre 2008

23 mars 2007 à 22:50
Re,

C'est deja comme ca dans mon programme. J'ai une Socket qui envoi que des commandes et un NetWorkStream qui envoi les données... Et biensur j'envoi un Cancel par la socket pour dire au serveur "arrete d'envoyer please" mais le problème c'est que dans la procédure d'envoi, il n'y a rien pour dire au client "c'est bon j'ai arreter d'envoyer".
0
ShareVB
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
25
23 mars 2007 à 22:59
salut,

ce qui est fait dans FTP, je crois est que quand le client envoi le cancel, il ferme le canal de données...comme ca le prb ne se pose pas...

ShareVB
0
fdiedler2000
Messages postés
383
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
1 décembre 2008

23 mars 2007 à 23:35
Certes mais si je ferme le NetWorkStream du serveur, justement normalement il devrait se passer quelque chose du coté du client (genre erreur...) mais y'a rien donc en gros, je canal du client ne sera aps ferme et le code va etre "bloqué" dans la procédure de reception jusqu'a la reception des données. Or si le serveur n'emet plus, alors le client pourra toujours attendre ses données lool

D'où le problème que je rencontre !
0
ShareVB
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
25
24 mars 2007 à 10:40
salut,

fermes-tu bien à la fois le flux et le socket :
http://support.microsoft.com/?scid=kb%3Ben-us%3B821625&x=16&y=11

sinon, regarde du côté de dataavailable...avec des thread.sleep...

ShareVB
0
fdiedler2000
Messages postés
383
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
1 décembre 2008

24 mars 2007 à 13:08
Salut,

Justement je suis du coté des DataAvailible mais j'ai decouvert quelque chose. Je pense que le srveur envois trop vite les données et a chaque envoi il n'attends pas la confirmation du client. Resultat j'ai mis un compteur de boucle des deux coté pour comparer et le client recoit au moins 1/3 de plus de données que le serveur en envoi !! En fait, j'envoi par block de 4097 Bytes mais le client recois parfois 1200, 1342, 675, 4097 ... bytes d'où le nombre de boucle plus importantes.

Le client doit donc fragmenter le block de 4097 en plusieurs block.... alors pourquoi bonne question ! Pourtant le fichier n'ai pas corrompu et sa taille est exacte à l'octet pres !

Coment faire pour demander au serveur la confirmation que le client a bien recu les bytes avant de continuer l'envoi ?

Je te donne le code commenté pour t'aider :

Procedure Envoi :

            Dim rdby As Long = 0
            Dim len As Integer = 0
            Dim buffed() As Byte = New Byte(4096) {}
            'Open the file requested for download
            Dim fin As FileStream = New FileStream(Path, FileMode.Open, FileAccess.Read)
            'One way of transfer over sockets is Using a NetworkStream
            'It provides some useful ways to transfer data
            Dim nfs As NetworkStream = New NetworkStream(sock)

            While rdby < SizeTotal
                'Read from the File (len contains the number of bytes read) : Size : 4097
                len = fin.Read(buffed, 0, buffed.Length)
                'Write the Bytes on the Socket
                nfs.Write(buffed, 0, len)
                'Increase the bytes Read counter
                rdby += len
            End While

            fin.Close()
            nfs.Close()

Procedure de Reception :

            Dim fout As FileStream = New FileStream("E:" & path, FileMode.Create, FileAccess.Write)
            Dim nfs As NetworkStream = New NetworkStream(sock)
            Dim ByteLues As Integer
            Dim buffer() As Byte = New Byte(4096) {}

            'loop till the Full bytes have been read
            While rby < SizeTotale
                'Read from the Network Stream
                ByteLues = nfs.Read(buffer, 0, buffer.Length)
                'Write data in the file
                fout.Write(buffer, 0, ByteLues)
                'increase number of bytes read
                rby += ByteLues
            End While

            fout.Close()
            nfs.Close()
0
ShareVB
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
25
24 mars 2007 à 21:08
salut,

en fait, TCP peut fragmenter les données et se débrouille pour qu'elles arrivent entre le client et le serveur sans erreur, dans l'ordre...donc no problem, c'est tout à fait normal...si tu est sur la boucle local, la bande passante est potentiellement infinie...si tu es sur un lan, les données sont par paquets de 1500 octets...sur le net, ca peut être pas cellules de 20 octets très fréquentes mais pas plus de 1500...

par contre tu peux régler le buffer du socket/networkstream à la taille (ou un multiple de la taille) de ton buffer...sinon le dataavailable te permet normalement de recevoir une exception quand l'autre bout de la connexion est fermée...en gros, tu mets un while nfs.dataavailable ... thread.sleep(100); end while autour du nfs.read...

ShareVB
0
fdiedler2000
Messages postés
383
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
1 décembre 2008

24 mars 2007 à 23:08
Salut,

Finalement j'ai reussi un truc mais je sais pas si ca va durer : j'ai créer une autre socket pour le transfert que j'ai donné en argument au NetWorkStream et lors de l'annulation je ferme la socket serveur et byteRead returne 0 et puis je sort de la boucle du client et je ferme la partie cliente !

Le dataAvalible plante toujours chez moi ^^ Impossible de savoir quand il est à True ou False et de plus le While DataAvalible = True .... End While ne marche pas ... En tout cas je sens que je vais encore avoir des surprises avec cette classe ^^
0