Bonjour,
J'ai un petit problème lors d'un envoi par une socket. Donc voila en gros une partie de mon application : un client envoie une requête à mon serveur et pour cette requête, mon serveur va rechercher des noms dans une base de données et les stocke dans une List<String>. Ensuite mon serveur concatène tout les noms espacés par le caractère "$" et le stocke dans un simple String. Dans mon exemple, mon serveur trouve une trentaine de nom et les concatène bien et les envoie. Le problème se situe sur mon client, il ne réceptionne que la moitié de ce que j'ai envoyéJe me demandais s'il y avait une limite de données à envoyer ?
Enfin voila mes bouts de codes :
Code serveur :
Donc en gros, il réceptionne une trame, qui est un String, et utilise une classe qui va la découper pour récupérer tout les éléments présent pour les mettre dans une List<String>. Ensuite, il se connecte à la base de données pour récupérer tout les noms pour ensuite les concaténer et les renvoyer vers le client.
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57 static void ReceptionRealisee(IAsyncResult ar) { Socket socketServ = (Socket)ar.AsyncState; int n = socketServ.EndReceive(ar); String msgClient = ASCIIEncoding.Default.GetString(buf, 0, n); String msgServeur = "nogapprotocol"; #region analyse de la trame recue par le client List<String> maListe = DecoupeTrame.decoupage(msgClient); if (maListe != null) { protocole = maListe[0]; int IDProtocole = Int32.Parse(protocole); #region Protocole GETALLFOURNISSEUR if (IDProtocole == ProtocolGAP.GETALLFOURNISSEUR) { if (ConfigurationManager.AppSettings["cheminBDMercator"] == null) throw new ExceptionPropertiesNotFound("Fichier de properties non disponible !"); else { String cheminMercator = ConfigurationManager.AppSettings["cheminBDMercator"]; ManipulationDBMercator manip = new ManipulationDBMercator(cheminMercator); List<String> allFournisseur = manip.getAllFournisseur(); msgServeur = ""; msgServeur = ProtocolGAP.GETALLFOURNISSEUR.ToString()+"$"; MessageBox.Show(allFournisseur.Count.ToString()); foreach (String fou in allFournisseur) { msgServeur = msgServeur + fou + "$"; } msgServeur = msgServeur + "#"; MessageBox.Show(msgServeur); } } #endregion byte[] tb = ASCIIEncoding.Default.GetBytes(msgServeur); IAsyncResult e = socketServ.BeginSend(tb, 0, tb.Length, 0, new AsyncCallback(EnvoiRealise), socketServ); e.AsyncWaitHandle.WaitOne(); }
Pour le client :
il utilise cette fonction pour réceptionner la trame :
qui va retourner le String et ensuite, il fait :
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 public String ReceptionRequete() { byte[] buf = new byte[1024]; try { IAsyncResult ar = socketC.BeginReceive(buf, 0, buf.Length, 0, new AsyncCallback(ReceptionRealisee), socketC); socketC.EndReceive(ar); String msgServeur = ASCIIEncoding.Default.GetString(buf, 0, buf.Length); List<String> liste = DecoupeTrame.decoupage(msgServeur); if (liste[0].CompareTo("2") == 0) { socketC.Shutdown(SocketShutdown.Both); socketC.Close(); msgServeur = "quit"; } return msgServeur; } catch (SocketException ex) { MessageBox.Show("Erreur de connexion !", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1); return null; } }
le foreach sert simplement pour ne pas récupérer le premier élément de la liste. Donc du coté de mon client, je n'ai pas le bon nombre de noms qui s'afficheront dans mon combo ...
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 String retour = client.ReceptionRequete(); List<String> templisteFournisseur = DecoupeTrame.decoupage(retour); List<String> listeFournisseur = new List<string>(); foreach (String fou in templisteFournisseur) { if (fou.CompareTo("3") != 0) { listeFournisseur.Add(fou); } } //MessageBox.Show(listeFournisseur.Count.ToString()); comboBoxFournisseur.DataSource = listeFournisseur;
Auriez-vous une idée ?
Merci d'avance,
Julien
Partager