Comment envoyer plusieurs données via winsocks [Résolu]

Messages postés
21
Date d'inscription
vendredi 14 octobre 2005
Statut
Membre
Dernière intervention
27 janvier 2016
- - Dernière réponse : 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
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
61
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 194 internautes nous ont dit merci ce mois-ci

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
61
3
Merci
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)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 194 internautes nous ont dit merci ce mois-ci

Messages postés
21
Date d'inscription
vendredi 14 octobre 2005
Statut
Membre
Dernière intervention
27 janvier 2016
0
Merci
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!
Messages postés
21
Date d'inscription
vendredi 14 octobre 2005
Statut
Membre
Dernière intervention
27 janvier 2016
0
Merci
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...
Messages postés
21
Date d'inscription
vendredi 14 octobre 2005
Statut
Membre
Dernière intervention
27 janvier 2016
0
Merci
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...
Messages postés
21
Date d'inscription
vendredi 14 octobre 2005
Statut
Membre
Dernière intervention
27 janvier 2016
0
Merci
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(