hudsonhawk3
Messages postés5Date d'inscriptionmercredi 12 février 2003StatutMembreDernière intervention14 septembre 2007
-
14 sept. 2007 à 09:49
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 2015
-
14 sept. 2007 à 20:31
Bonjour, je tente de développer une aplication client serveur avec un accès à une base de donnée.
le serveur se connecte à la base de donnée et récupère les demandes du client.
Après avoir récupérer la demande du client, le serveur exécute des requêtes et envoie les résultats au client.
Mon problème est que du coté client, je veux afficher les résultats dans une listebox et que malgré le fait que j'ai placé un DoEvents après mon senddata coté serveur; il affiche tous les résultats sur la même ligne.
j'ai réussi à lui faire afficher la liste correctement mais pour ça j'ai mis le DoEvents dans une boucle:
For i = 1 to 500000
DoEvents
Next i
ça marche mais le temps d'attente est beaucoup trop long. Alors si vous pouviez m'aider, ce serait super merci. autrement je développerais ça en PHP, c'est beaucoup plus simple.
Merci d'avance.
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 14 sept. 2007 à 11:14
Salut,
Sans grande conviction essaie peu etre
Private Sub winsock1_dataArrival(ByVal bytestotal As Long)
Dim stringdata As String
Call Winsock1.GetData(stringdata, vbString, bytestotal)
Call ListBox.AddItem(stringdata)
End Sub , ----
[code.aspx?ID=41455 By Renfield]
hudsonhawk3
Messages postés5Date d'inscriptionmercredi 12 février 2003StatutMembreDernière intervention14 septembre 2007 14 sept. 2007 à 11:46
En plaçant le doevents dans la boucle ça marche, le serveur ne m'envoie donc pas tout d'un coup. De plus, l'orsque j'exécute l'exe client et serveur sur le meme pc, ça marche très bien, mais lorsque je lance le client sur un autre pc, ça marche plus, donc je suppose que c'est bien un problème de temps réponse.
Je ne peux pas découper la trame avant de l'ajouter, j'ai au moins 30 tables dans la base de données avec je ne sais combien de données, si je dois m'amuser à tout découper à chaque fois, ç'est vraiment de la merde.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 14 sept. 2007 à 20:31
Salut
Deux problèmes distincts :
- L'envoi massif de données Lorsque tu envoies des données par Winsock (WS), elles sont réceptionnées (sic) par le client.
Le WS possède un buffer de réception.
Quand le WS reçoit des données, l'évènement DataArrival se déclenche.
Mais il se déclnche parce qu'il y a des données dans le buffer, pas parce qu'il a terminé de recevoir les données.
Donc les données reçues peuvent être partielles et incomplètes.
Pour la réception d'un grand nombre de données, ce déclenchement dépend de la charge de ta machine (si elle a le temps ou pas). Il est donc normal que le comportement diffère entre deux machines (ou si le serveur et le client sont sur la même machine)
- La séparation des données Quand tu expédies les données et que tu dois redécouper ces données à la réception, c'est à toi de gérer ce découpage.
En effet, si le serveur envoie une dizaine de SendData à la suite, tu risques fort de recevoir toutes ces données en une seule fois lors du premier déclenchement de DataArrival.
Il faut donc insérer des 'repères' dans tes données, repères qui te serviront à la réception à correctement dissocier les infos.
Par exemple :
Serveur.SendData "le premier texte à envoyer" & Chr$(0)
Serveur.SendData "le second texte à envoyer" & Chr$(0)
Côté client, quand tu recevras ces données, elle seront comme ceci :
"le premier texte à envoyer" & Chr$(0) & "le second texte à envoyer" & Chr$(0)
Il te suffira alors d'effectuer un découpage de cette chaine pour repérer le premier puis le second message, facile avec un simple Split :
Dim monTableau() As String
monTableau = Split(DonnéesReçues, Chr$(0))
Et tu recevras :
monTabelau(0) contiendra "le premier texte à envoyer"
monTabelau(1) contiendra "le second texte à envoyer"
Le Chr$(0) : je l'ai choisi arbitrairement car c'est un caractère qu'on n'a très peu de chance de rencontrer dans les chaines de texte traitée, mais tu peux choisir ce que tu veux, un texte comme "FIN" pourquoi pas, mais si ces lettres apparaissent dans tes données, le Split se brèlera les pinceaux !
Pour terminer, je te conseillerai fortement d'aprivoiser les WS en regardant des sources (bien notées) de Chat : Ce problème est toujours traité.
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)