Socket+doevents

hudsonhawk3 Messages postés 5 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 14 septembre 2007 - 14 sept. 2007 à 09:49
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 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.

7 réponses

jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
14 sept. 2007 à 10:42
Salut,
Il faudrait plutot montrer le code qui ajoute dans la listbox (le RecvData) je pense que cela nous apprendras plus de chose que le DoEvents

@+: Ju£i?n
Pensez: Réponse acceptée
0
hudsonhawk3 Messages postés 5 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 14 septembre 2007
14 sept. 2007 à 11:02
private sub winsock1_dataArrival(byval bytestotal as long)
dim stringdata as string
   winsock1.getdata stringdata
   listbox.additem stringdata
end sub

voila le code.
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
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]

@+: Ju£i?n
Pensez: Réponse acceptée
0
hudsonhawk3 Messages postés 5 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 14 septembre 2007
14 sept. 2007 à 11:27
Merci mais ça ne change rien du tout. si tu as d'autres idées. je suis preneur.
0

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

Posez votre question
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
14 sept. 2007 à 11:34
Salut,
Cela veut peu etre dire que le serveur t'envoie tout d'un coup.
ou bien qu'il te faut découper la trame avant de l'ajouter dans la listbox

@+: Ju£i?n
Pensez: Réponse acceptée
0
hudsonhawk3 Messages postés 5 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 14 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.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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)
0
Rejoignez-nous