Envoi de fichiers par sockets en VB.NET

Envoi de fichiers par sockets en VB.NET - C#/.NET managed - Programmation

Marsh Posté le 06-04-2006 à 10:50:18    

Bonjour,
 
J'ai besoin de créer une application en VB.NET qui permet d'envoyer et de récupérer des messages ainsi que d'envoyer et de récupérer des fichiers.J'utilise donc une socket cliente et une serveur pour le transfert de message.
Je crois que pour le passage de fichier, je peu utiliser les memes sockets non?
Dans ce cas, j e ne comprends pas comment lui faire comprendre quand il doit passer dans les methodes de conception et de transmission de fichiers....
Bref je suis un peu perdue dans mes sockets
 
 :sweat:

Reply

Marsh Posté le 06-04-2006 à 10:50:18   

Reply

Marsh Posté le 06-04-2006 à 17:32:16    

les données qu'on passe à la socket sont sous forme de byte. De ce fait, il est simple de passer un fichier puisqu'un fichier est constitué d'un ensemble de byte.  
 
Maintenant, pour différencier l'envoie de donnée et l'envoie de fichier, il suffit de mettre en place un petit byte qui préciserait le type. et de décoder de l'autre coté

Reply

Marsh Posté le 06-04-2006 à 17:49:49    

Tu penses donc que je peu utiliser les memes sockets pour l"envoie de fichiers et de messages mais que je dois passer un byte comme parametre a l'envoi pour différencier les transferts.
Je vais essayer mais il y a aussi des notions que je ne comprends pas vraiment... J'ai récupérée un code et donc pour comprendre c''est pas facil!!
Je ne comprends pas dans les fonctions asynchrones comment le client reconnait un envoie du serveur et déclenche la procedure ici le nom est sendcallBack...


Message édité par saikal le 06-04-2006 à 17:50:10
Reply

Marsh Posté le 06-04-2006 à 20:35:34    

dans un échange TCP (donc mode connecté). l'un est en attente d'une réponse et l'autre envoie. De ce fait, l'asynchronisme n'est la que pour rendre l'envoie asynchrone et ne pas bloqué le programme pendant les échanges afin de laisser la main à l'utilisateur sur son programme. Donc ne te préoccupe pas de cela. C'est semblable au Thread, ça permet de faire tourner l'envoie/réception en arriere plan.  
 
l'exemple du byte n'est qu'un exemple, il y a dix milles possibilités.  
 
par exemple, ce qui se fati souvent, c'est lenvoie d'un en tete complémentaire décrivant les données (TCP, UDP, HTTP, POP, SMTP, etc... fonctionne selon se principe en cachant cela aux users).

Reply

Marsh Posté le 07-04-2006 à 10:35:34    

LE problème c'est que l'envoie de ce byte je ne peu le faire que dans un beginSend non? Or il n'y a pas d'options qui le permet...
Enfin bon je crois je suis vraiment pas douée

Reply

Marsh Posté le 07-04-2006 à 12:02:49    

Pour etre plus précise je pense qu'en fait la solution est d'avoir deux fonctions asynchrones différentes une pour les messages et une autre pour les fichiers mais je n'arrive pas a le mettre en place.
Lors de mes tests, a chaque fois, il part dans les fonctions des messages et puis fait comme si s'etait un message... CAR la fonction BeginReceive appelle la fonction de gestion des messages.

Reply

Marsh Posté le 07-04-2006 à 15:46:56    

2 fonctions asynchrones n'est pas une bonne idée.
Rien ne t'assure de la fiabilité des données. Ex, tu reçois une demandes d'info alors que tu es en train de recupérer un fichier.
C'est source à embrouilles.
 
Tu dois formaliser les données que tu envoies :
- Tu attends qqch.
- Tu reçois une trame (on va supposer que tu codes tes infos sur 4 octets).
- Tu décodes ces 4 octets, qui t'indiques que tu vas recevoir un fichier binaire de 230ko.
- Tu sais que tu dois lire 230ko de données pour en faire un fichier.
- Tu repasses en écoute, et tu attends la prochaine instruction.


---------------
H. - 48h en fiat et j'ai déjà perdu la maitrise de mon argent
Reply

Marsh Posté le 07-04-2006 à 16:06:25    

Ok merci je vais essayer parceque la franchement je commence a manquer d'idée.
Donc il faudrait que j'envoie avant chaque envoi de fichier ou de messages un message qui fait comprendre au programme quel type de structure je vais envoyer.
Bon j'essaye et je te tiens au courant.
MERCI!!

Reply

Marsh Posté le 07-04-2006 à 16:40:35    

généralement ce que moi je fais, il ne faut surtout pas envoyer de INT, FLOAT sur le réseau (problème de compatibilité avec certain système).  
 
Donc ce que tu fais
 
Envoie une chaine de caractère de 4 bytes
=> "FILE" pour fichier
=> "DATA" pour normal
 
Envoie une chaine de caractère de 10 bytes pour la taille qui va suivre.
 
Puis tu envoie le reste  
 
Donc la trame ressemblerait à ça:
 
- Header (14 bytes)
>FILE______1024<
- Data (longueur spécifié dans le header).
 
Comme ça coté client, tu lit 14 bytes, tu sais que les 4 premiers donne le type. Et les dix dernier donne la longueur en bytes. Suffit de bouclé après correctement jusqu'a avoir lu toutes les données...
 
C'est aussi simple que ça


Message édité par moi23372 le 07-04-2006 à 16:43:06
Reply

Marsh Posté le 07-04-2006 à 17:08:13    

oulalalallalala tu me fais rire la  
c'est aussi simple que ca bon heu oui peut etre mais bon moi je trouve pas trop
Donc a ce que j'ai compris tu rajoute ces trames a ton buffer que tu envoie en fait c'est  ca?

Reply

Marsh Posté le 07-04-2006 à 17:08:13   

Reply

Marsh Posté le 07-04-2006 à 17:35:42    

oui et juste quelques autres questions , quels méthodes tu utilises pour rajouter tes entetes a ton buffer? et est ce que tu remplis ton buffer et tu rajoutes lesen têtes apres ou alors l'inverse?
Merci merci merci

Reply

Marsh Posté le 07-04-2006 à 18:10:45    

saikal a écrit :

oui et juste quelques autres questions , quels méthodes tu utilises pour rajouter tes entetes a ton buffer? et est ce que tu remplis ton buffer et tu rajoutes lesen têtes apres ou alors l'inverse?
Merci merci merci


 
tu as un buffer d'envoie. Tu fais comme tu veux, mais ça doit partir, donc vaux mieux construire ton buffer de bytes correctement. Il est facile par exemple de convertir de chaine de caractère (string) vers un tableau de bytes.
 
exemple:
 

Code :
  1. //header 14 bytes
  2. string header = "FILE";
  3. header = header + "      1024";
  4. byte[] headerb = Encoding.Unicode.getbytes(header);
  5. //fichier
  6. byte[] file = ... ;
  7. //construction buffer vers le réseau
  8. byte[] buffer = new byte[file.lengh + headerb.lengh];
  9. //je ne sais plus s'il y a une méthode pour copier direct des bytes dans un autre tableau
  10. int i=0;
  11. for (i=0 ; i<headerb.length ; i++)
  12.    buffer[i] = headerb[i];
  13. //copie fichier
  14. for (int j = 0; i<file.lengh ; j++, i++)
  15.    buffer[i] = file[j];
  16. //Voila que ton buffer est près à être envoyé sur le réseau. C'est quand mm pas compliqué.


 
Et pour la lecture, tu fais tout dans le sens inverse.
Tu lis 14 bytes (4 pour le type, 10 pour la taille).
Puis tu fais en concéquence.
 
PS: l'entete tjs en premier, sinon il n'a pas de sens. Le but est que le client ne lise d'abord que l'entete puis réagit en conséquence. :s C'est les bases de la programmation réseau


Message édité par moi23372 le 07-04-2006 à 18:11:57
Reply

Marsh Posté le 10-04-2006 à 09:06:00    

Merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed