salut,
Je poste pour un problème de transfert des blocs de Byte. Par exemple quand j'envoie une image de 5 mo, décomposée en Byte où le buffer size=4000, arrivé à l'envoie du 10ème, ça bloque!
voici un extrait de code d'envoie de l'image :
En gros voilà comment , j'envoie l'image
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
37
38
39
40
41
42
43 const int BUFFER_SIZE = 4000; //récuperation fichier image FileStream fichier = new FileStream(fileName, FileMode.Open, FileAccess.Read); //header sert d'identifiant ( peut être une image,un fichier ...) string header = "IMG_"+openFileDialog1.SafeFileName+"?"; // fin d'envoie d'un fichier (symbole :) string end = "IMG_" + openFileDialog1.SafeFileName + ":"; byte[] headerb = Encoding.Unicode.GetBytes(header); byte[] endb = Encoding.Unicode.GetBytes(end); //construction buffer vers le réseau byte[] contenu = new byte[BUFFER_SIZE]; byte[] morceau = new byte[headerb.Length+BUFFER_SIZE]; byte[]morceauFin=new byte[endb.Length+BUFFER_SIZE]; int tailleBit=0; int totalLu=0; NetworkStream nfs=new NetworkStream(socket); int i = 0; //boucle d'envoie des groupes de BYTE while (totalLu < fichier.Length && nfs.CanWrite) { //recuperation BYTE tailleBit = fichier.Read(contenu, 0, contenu.Length); // Copie du header for (i = 0; i < headerb.Length; i++) morceau[i] = headerb[i]; //copie header + fichier for (int j = 0; i < contenu.Length; j++, i++) morceau[i] = contenu[j]; //ecriture sur socket nfs.Write(morceau, 0, tailleBit + headerb.Length); totalLu = totalLu + tailleBit; }
Tant Que la taille de fichier n'est pas atteinte par totalLu, je continue à envoyer les groupe de BYTE, sachant que chaque groupe est composé d'un header (identifiant) avec son type (IMG) et son nom!
et là c'est le code de récupération
En gros là , je récupère un bloc, je retire le header, et j'écris dans FS!!
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
37
38 //fichier ou image à reconstruire FileStream fs = new FileStream("image", FileMode.Create, FileAccess.Write, FileShare.None); while (true) { boolFin = false; p = 0; result = null; chaineBit = null; try { if (sock != null) { byte[] b = new byte[BUFFER_SIZE]; int k = ((Socket)sock).Receive(b); chaineBit = Encoding.UTF8.GetString(b); //on regarde si chaine commence par IMG if (chaineBit.StartsWith("I")) { while (boolFin != true) { char c = Convert.ToChar(b[p]); result += Convert.ToChar(b[p]); if (c.ToString().Equals("?")) { //suppression du header du BYTE string chaineCoupe = chaineBit.Remove(0, result.Length); byte[] blocImgBit = Encoding.Unicode.GetBytes(chaineCoupe); // Ecriture du bloc dans le fichier fs.Write(blocImgBit, 0, blocImgBit.Length); boolFin = true; } p++; }
Donc mon soucis est que dans l'itération d'envoie des BYTE, ça se bloque vers l'envoie du 10 ème paquet!!
Je sais pas pourquoi, peut-être que la socket est saturée???
Quelqun a une idée?
Partager