Comment envoyer plusieurs données via winsocks

Résolu
bast198 Messages postés 21 Date d'inscription vendredi 14 octobre 2005 Statut Membre Dernière intervention 27 janvier 2016 - 12 mars 2006 à 14:41
bast198 Messages postés 21 Date d'inscription vendredi 14 octobre 2005 Statut Membre Dernière intervention 27 janvier 2016 - 13 mars 2006 à 18:10

6 réponses

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
12 mars 2006 à 15:23
Salut
Il suffit de t'inspirer des sources qui parlent de Chat en réseau.
Puisqu'il faut identifier des éléments, il faut ajouter à tes données des identificateurs qui seront faciles à retrouver dans la chaine de réception : il faut que tu t'inventes un protocole.
Exemple :
Nom de la donnée<marqueur fin nom>la donnée texte à transmettre<marqueur fin texte><marqueur fin de message>
Pour les marqueurs, il faut choisir un texte qu'il n'est pas possible de retrouver à l'intérieur des données texte que tu vas transmettre pour qu'il n'y ait pas d'erreur de reconnaissance possible. Je te conseille de simples codes ASCII qui ne fassent pas partie des caractères "imprimables".
Je choisis :
<marqueur fin nom> = Chr(0)
<marqueur fin texte> = Chr(0)
<marqueur fin message> = Chr(1)
Quand j'envoie un message, il aura cette forme :
SendData "Message Alerte" & Chr(0) & "Blablabla" & Chr(0) & Chr(1)
puis
SendData "Titre Alerte" & Chr(0) & "Y sont vraiment sympas chez Codes-Sources" & Chr(0) & Chr(1)
puis
SendData "Icone Alerte" & Chr(0) & Cstr(vbCritical) & Chr(0) & Chr(1)
etc ...

A la réception, dans le buffer de ton Winsock, tu vas recevoir ces données soit partiellement, soi toutes les unes collées aux autres.
Pour savoir si un message est complet, il suffit de chercher dans la chaione de réception si on trouve un Chr(1) = marqueur de message. (Avec Instr)
Si non : Il faut mémoirser le texte reçu et attendre la suite avant de traiter
Si oui : On a un message (au moins un) complet : on va pouvoir le décomposer :

Pour décomposer les messages entiers : Il suffit de détecter les Chr(1) :
Dim uMessages() As String
uMessages = Split(TexteReçu, Chr(1))
Tu auras le 1er message dans uMessages(0) et la dernière partie dans uMessages(UBound(uMessages))
Attention : le dernier message n'est peut-être pas complet
Ensuite, il faut décomposer le message lui même : même principe :
Dim uTextes As String
uTextes = Split(uMessages(No), Chr(0))
Tu auras "Message Alerte" dans uTextes(0) et "Blablabla" dans uTextes(1)
Il te suffit de faire des boucles de lectures (For-Next) pour lire à tour de rôle chaque message et chaque texte.
Pour chaque texte, il te suffit de mémoriser les données en faisant un Select Case :
Select Case uTextes(0)
Case "Message Alerte"
maVarTexteAlerte = uTextes(1)
Case "Titre Alerte"
maVarTitreAlerte = uTextes(1)
Case "Icone Alerte"
maVarIconeAlerte = uTextes(1)
' C'est la dernière : On peut envoyer le Message
MsgBox maVarTexteAlerte, maVarIconeAlerte, maVarTitreAlerte
End Select

Ta structure sera en place. Tu peux ajouter encore pleins d'échanges entre ton serveur et ton client : il suffit de compléter la liste des mots clés et de respecter la structure des messages.
Attention : Ceci ne permet que d'échanger du texte. Pour les transferts de fichiers, il faudra faire autrement car le contenu des fichiers peut contenir des Chr(0) et perturber le décodage à la réception.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accro
3
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
13 mars 2006 à 14:46
Salut
- Dans le code que tu as mis, tu as oublié de faire une boucle pour énumérer les messages reçus (de 0 à UBound(uMessages))
- Il faut bien sûr que tes variables maVarTitre ... soient toutes déclarées en Private dans la partie Déclarations de ta forme afin qu'elles gardent leurs valeurs entre deux déclenchements de DataArrival (si réponse lente)
- Dans le code que je t'ai proposé, j'avais utilisé Cstr(vbCritical) et pas vbCritical tout seul justement pour qu'il utilise la valeur (transformée en String) et pas le nom de la variable.

Nota : Si ces réponses te satisfont, n'oublie pas de cliquer sur "Réponse acceptée" : ça aidera les autres qui pourraient se poser la même question.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
3
bast198 Messages postés 21 Date d'inscription vendredi 14 octobre 2005 Statut Membre Dernière intervention 27 janvier 2016
12 mars 2006 à 14:44
bonjour. je voudrais envoyer plusieurs données via un controle winsocks.

par exemple en 1er : msg qui indique que le serveur doit afficher une alerte
puis apres le titre, l'icone, et le message de l'alerte.
je sais pas comment envoyer toutes ces données d'un coup et faire le tri lors de la reception.

merci!
0
bast198 Messages postés 21 Date d'inscription vendredi 14 octobre 2005 Statut Membre Dernière intervention 27 janvier 2016
12 mars 2006 à 17:11
pour essayer je n'ai utilisé qu'un bout du code :
pour le client :
Private Sub Command1_Click()
Winsock1.Connect "127.0.0.1", 7543
End Sub

Private Sub Command2_Click()
Winsock1.SendData "Message Alerte" & Chr(0) & "Blablabla" & Chr(0) & Chr(1)
End Sub

Private Sub Winsock1_Connect()
lbl1.Caption = "connecté"
End Sub




et pour le serveur :

Private Sub Form_Load()
Winsock1.LocalPort = 7543
Winsock1.Listen
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim uMessages() As String
Dim uTextes As String
uMessages = Split(TexteReçu, Chr(1))
uTextes = Split(uMessages(No), Chr(0))
Select Case uTextes(0)
Case "Message Alerte"
maVarTexteAlerte = uTextes(1)
MsgBox maVarTexteAlerte
End Select
End Sub



cependant ca ne marche toujours pas. il me dit que l'état de connection ou de protocol est erroné. (erreur 40006)

j'ai essayé plusieurs trucs et ca me sort toujours une erreur...
0

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

Posez votre question
bast198 Messages postés 21 Date d'inscription vendredi 14 octobre 2005 Statut Membre Dernière intervention 27 janvier 2016
12 mars 2006 à 21:59
oups oubliez mon dernier message :p
j'ai pas reflechi et j'ai oublié de mettre plein de trucs. cependant ca marche.
par contre quand je veut envoyer la variable qui contient vbcritical, vbinformations etc il me met automatiquement des "" autour. ce qui me donne "vbcritical" ce qui fait planter...
0
bast198 Messages postés 21 Date d'inscription vendredi 14 octobre 2005 Statut Membre Dernière intervention 27 janvier 2016
13 mars 2006 à 18:10
ok merci beaucoup. finalement j'ai opté pour ce code ::

Private Sub Command1_Click()
Dim img As String
Dim Réponse As String
If Opt(0).Value = True Then
img = vbCritical
ElseIf Opt(1).Value = True Then
img = vbExclamation
ElseIf Opt(2).Value = True Then
img = vbQuestion
ElseIf Opt(3).Value = True Then
img = vbInformation
End If

Réponse = "MBox(" & Text1.Text & "_" & CStr(img) & "£" & Text2.Text & ")"
Form1.Winsock1.SendData Réponse 'Envoie la réponse
End Sub

et le serveur detecte le MBox(
0
Rejoignez-nous