IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Etude, théorie et pratique du controle winsock


Sujet :

VB 6 et antérieur

  1. #1
    Membre régulier Avatar de Ramdoulou
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 286
    Points : 107
    Points
    107
    Par défaut Etude, théorie et pratique du controle winsock
    Bonjour à tous

    Alors voilà, je suis motivé pour apprendre à me servir de ce controle pour la simple et bonne raison que mes méthodes sont trop limités.

    D'habitude, pour envoyer/recevoir des données, je fais ça à ma manière (Upload fichier text sur ftp, ou récupération de données sur une page web) et par conséquent, l'appli est sans cesse en actualisation pour télécharger les données, c'est du n'importe quoi.

    Dans ce topic : http://www.developpez.net/forums/d62...nt-personnage/

    j'ai réussi à mettre en mouvement des petits personnages, mais j'aimerai savoir comment faire pour que ca soit visible par tous les utilisateurs, autrement dit, on revient au MMORPG.
    Comment sauvegardé les déplacements qu'a effectué telle personne avec le personnage par exemple, envoyer les données instantanément, afin que les utilisateurs qui seront à ce moment là "spectateurs" voient les déplacements.

    Donc voilà, je pense que je laisserai ouvert ce topic un certains temps pour pouvoir bien experimenter la chose, je compte sur votre aide ;p

    Merci d'avance !!

    [edit] : Je suis en train d'étudier ce controle, donc si vous avez des conseils ou des precisions à m'apporter, je suis prenneur =D

  2. #2
    Membre régulier Avatar de Ramdoulou
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 286
    Points : 107
    Points
    107
    Par défaut
    [edit] Autant pour moi, petite erreur de synthèse...^^

  3. #3
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    bonjour, Ramdoulou ..

    tu as bien évidement commencé par lire les tutos :

    Créer un client mail avec le contrôle Winsock

    Série de tutoriels consacrée à la programmation réseau

    bonne étude

  4. #4
    Membre régulier Avatar de Ramdoulou
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 286
    Points : 107
    Points
    107
    Par défaut
    Je vais étudier tout ça, merci =)

    J'ai déjà réussi à effectuer une connexion entre 2 pc (client / server), et à récupérer des données par exemple dans des textbox etc...

    j'avance lentement, mais surement, merci pour ton aide =)

  5. #5
    Membre régulier Avatar de Ramdoulou
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 286
    Points : 107
    Points
    107
    Par défaut
    J'ai un petit probleme de synthèse dans le code suivant :

    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
    Private Sub tcpServer_ConnectionRequest _
    (Index As Integer, ByVal requestID As Long)
     
       If Index = 0 Then
          intMax = intMax + 1
          Load tcpServer(intMax)
          tcpServer(intMax).LocalPort = 0
          tcpServer(intMax).Accept requestID
          Load txtData(intMax)
       End If
     
    ' Vérifie que le contrôle est fermé. Sinon, ferme
    ' la connexion en cours avant d'accepter la
    ' nouvelle.
    If tcpServer.State <> sckClosed Then _
    tcpServer.Close
    ' Accepte la demande avec le paramètre requestID.
    tcpServer.Accept requestID
    End Sub
    On me dit concernant : "(Index As Integer, ByVal requestID As Long)"
    que la déclaration de procédure ne correspond pas à la description de l'évenement ou de la procédure du même nom.

    Jsuis persuadé que ca concerne"(Index as Integer)" mais pourquoi ? =o

  6. #6
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    syntaxe pas synthèse;..


    C'est qu'ici tcpServer désigne un groupe de contrôle WinSock ..., met la propriété index à 0 de ton contrôle WinSock

  7. #7
    Membre régulier Avatar de Ramdoulou
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 286
    Points : 107
    Points
    107
    Par défaut
    Oui syntaxe raaah ce mot a du mal à passer ^^

    Merci =)

    Mais maintenant ca me le fait avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Private Sub tcpServer_DataArrival _
    (ByVal bytesTotal As Long)
    Cette partie est necessaire à présent ? Car peut etre qu'elle est en trop, je parle de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub tcpServer_DataArrival _
    (ByVal bytesTotal As Long)
    ' Déclare une variable pour les données reçues.
    ' Invoque la méthode GetData et paramètre pour
    ' ces données la propriété Text d'un contrôle
    ' TextBox nommé txtOutput.
    Dim strData As String
    tcpServer.GetData strData
    txtOutput.Text = strData
    End Sub
    Non ?

  8. #8
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    ben la c'est Index qui te manque.. je ne sais pas à partir de quoi tu "étudie" mais cela semble être une gestion de multiple connexion un serveur, avec plusieurs clients.. et pour chaque clients un contrôle WinSock serveur , membre de ton groupe de contrôle..

  9. #9
    Membre régulier Avatar de Ramdoulou
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 286
    Points : 107
    Points
    107
    Par défaut
    C'est bon c'est résolue, jsuis en train de resoudre d'autres ptits problemes =)

  10. #10
    Membre régulier Avatar de Ramdoulou
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 286
    Points : 107
    Points
    107
    Par défaut
    Alors enfaite j'ai pas mal de problemes...
    Niveau Syntaxe, jcomprend pas trop : "Load txtData(intMax)" et ça me pose un probleme "Procédure ou fonction non définie"

    Et ensuite, jme suis aperçu que si je supprimais cette ligne, la connexion se faisait, mais sur ce meme pc (où il y a le server), quand je tappe un truc ca marche, si jme met sur un autre pc en meme temps, ca marche aussi, mais si je retourne sur celui la, je tappe un truc et ça efface tout =s

    Donc vla, si quelqu'un peut me dire ce qui cloche dans mon code ça serait sympa =D

    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
    Private intMax As Long
     
     
    Private Sub Form_Load()
       intMax = 0
       tcpServer(0).LocalPort = 1001
       tcpServer(0).Listen
     
     
    ' Donne à la propriété LocalPort une valeur
    ' entière. Puis invoque la méthode Listen.
    'tcpServer.LocalPort = 1001
    'tcpServer.Listen
    ' Affiche la feuille client.
    'frmClient.Show
    End Sub
     
    Private Sub txtSendData_Change()
    ' Le contrôle TextBox nommé txtSendData contient
    ' les données à envoyer. Chaque fois que l'utilisateur entre du
    ' texte dans le contrôle textbox, la chaîne est envoyée en
    ' utilisant la méthode SendData.
    tcpServer(intMax).SendData txtSendData.Text
    End Sub
     
    Private Sub tcpServer_DataArrival _
    (Index As Integer, ByVal bytesTotal As Long)
    ' Déclare une variable pour les données reçues.
    ' Invoque la méthode GetData et paramètre pour
    ' ces données la propriété Text d'un contrôle
    ' TextBox nommé txtOutput.
    Dim strData As String
    tcpServer(intMax).GetData strData
    txtOutput.Text = strData
    End Sub
     
    Private Sub tcpServer_ConnectionRequest _
    (Index As Integer, ByVal requestID As Long)
     
       If Index = 0 Then
          intMax = intMax + 1
          Load tcpServer(intMax)
          tcpServer(intMax).LocalPort = 0
          tcpServer(intMax).Accept requestID
          'Load txtData(intMax)
     
       End If
     
    ' Vérifie que le contrôle est fermé. Sinon, ferme
    ' la connexion en cours avant d'accepter la
    ' nouvelle.
    'If tcpServer.State <> sckClosed Then _
    'tcpServer.Close
    ' Accepte la demande avec le paramètre requestID.
    'tcpServer.Accept requestID
    End Sub

  11. #11
    Membre régulier Avatar de Ramdoulou
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 286
    Points : 107
    Points
    107
    Par défaut
    Apres avoir effectué quelques tests, jme rend bien compte que ya un ptit soucis dans mon code précédent, car au final c'est toujours un tchat à 2...si ya plus, ben au lieu d'afficher ce que j'ecris, ca efface tout carrement =s

    Mais vraiment jcomprend pas ce que signifie : "Load txtData(intMax)"
    Ca charge quoi ? J'ai essayé de remplacer txtdata par txtsenddata (le nom du textbox du server dans lequel on tappe le texte, mais ca marche pas...

  12. #12
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    on ne voit pas tout ton code, mais j'ai l'impression que tu gère mal ton index :


    dans la procédure évènementielle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Private Sub tcpServer_DataArrival _
    (Index As Integer, ByVal bytesTotal As Long)
    tu reçoit un message du client dont le numéro est stocké dans la variable index

    et avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tcpServer(intMax).GetData strData
    tu récupère les données écrite par le dernier client connecté, c'est pas forcément le même. ..

  13. #13
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Load txtBox(NumeroTextBox) permet de charger à la volée un nouveau controle du meme type que txtBox, ce nouveau controle héritera de tous les propriétés et les metodes du txtBox que tu as placé sur ta feuille.
    Il faut donc au départ, placer un txtBox sur ta feuille et, pour pouvoir en avoir plusieurs, lui donner 0 dans la propriété index.
    A partir de la là, il est possibe de faire un clone du txtBox a l'aide de la méthode Load . Il faudra aussi donner à la methode load, un numéro d'index qui n'aura pas encore été utilisé.
    Exemple:
    Load txtBox(1) créera un nouveau txtBox dont la propriété index sera 1
    Si le numéro est dèjà utilisé > boom
    pour acceder aux propriétés individuelles de ce txtBox, on fera txtBox(1).propriété = valeur
    Dans ton code tu verra que les procédure événement du txtBox de départ ont un paramètre de plus : Index As Integer. Qunad l'évement se declenche, il suffit de vérifier cet Index pour savoir quel clone à déclenché l'evénement.

  14. #14
    Membre régulier Avatar de Ramdoulou
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 286
    Points : 107
    Points
    107
    Par défaut
    Merci beaucoup pour cette explication !

    Donc txtData doit correspondre logiquement à quel textbox ? Celui où l'on peut ecrire dedans pour que tous les utilisateurs ayant le client de lancé voient ce qu'il y a d'ecrit ? Ou pour le textbox d'affichage de ce qu'il y a d'ecrit ?

    Et autre chose, pourquoi "cloner" un textbox sans l'autre, et pourquoi cloner tout simplement ? Pour faire en sorte que plusieurs connexions soient faisables, il devrait y avoir que le Winsock à cloner non ?

    Suis-je à côté de la plaque, ou sur la bonne voie ?

    Merci d'avance

    Bbil : Comment je dois faire alors pour que ca soit le même oO car j'ai beau essayer de créer des variables ayant differentes fonctions, j'obtiens pas de resultat =/

  15. #15
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Donc txtData doit correspondre logiquement à quel textbox ?
    Ben au txtData qui se trouve sur ta feuille et dont l'index est zéro. Nous sommes des informaticiens, on ne fait pas dans la divination.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Et autre chose, pourquoi "cloner" un textbox
    Apparement tu travailles sur un serveur qui doit recevoir plusieurs connections simultanées. Si tu sais combien au départ, pas de problème, tu pose autant de controles que tu as de connection sur ta feuille et le tour est joué. Mais si tu sais pas ? tu fais comment ? simple , tu charges les composants supplémentaires au fur et à mesure de la montée en charge. Et tu peux egalement utiliser unload pour decharger les composants dont tu n'as plus besoin.

  16. #16
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par Ramdoulou Voir le message
    ....
    Bbil : Comment je dois faire alors pour que ca soit le même oO car j'ai beau essayer de créer des variables ayant differentes fonctions, j'obtiens pas de resultat =/
    l'évènement DataArrival , te renvoi dans index, le numéro de contrôle qui à reçu le message, utilise cet index pour récupérer ce message avec getData

  17. #17
    Membre régulier Avatar de Ramdoulou
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 286
    Points : 107
    Points
    107
    Par défaut
    Donc alors, je récapitule.

    Voici ma feuille :


    Text1 (nommé txtSendData) est le textbox dont les données inscrites dedans vont être récupérées puis affichées dans le client (une application appart) sous un textbox (le client contient les mêmes textbox, donc il est aussi possibles d'ecrire avec le client).

    Text2 (nommé txtOutput) est le textbox qui affiche les données qui ont été récupérées sous Text1 peu importe sa provenance, du server ou d'un client.

    L'index est paramétré sur vide pour ces 2 texts.

    Le controle Winsock a l'index réglé sur 0.

    Donc si j'ai bien compris, je dois régler l'index de Text1 et Text2 sur 0 et remplacé ensuite la ligne par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Load txtSendData(intMax)
    ?

    Ensuite, concernant ton dernier message bbil, je dois créer une variable qui stockera la valeur de l'index de DataArrival ?

    Excusez moi si je suis à côté de la plaque, mais j'essaye vraiment de comprendre avec mes moyens, et jsuis pas exellent, et sur ce coup, jtrouve que c'est un controle pas fastoche à manipuler mais il n'est pas question que je laisse tomber =)

  18. #18
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    non mon dernier message était juste une interrogation sur la procédure tcpServer_DataArrival, dans ton code, procédure qui à index comme paramètre, mais dans la suite du code (dans cette procédure) tu n'utilise pas comme il serai logique index, mais intmax:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tcpServer(intMax).GetData strDatatcpServer(intMax).GetData strData
    , remplace intMax par index ...

  19. #19
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Si je peux me permettre quelques remarques :

    Tu as un controle tcpServer(0). Celui ci ne sert qu'a recevoir les demandes de connexions. Des que tu recois une demande de connexion, tu crees un nouveau tcpServer, d'indice "nombre de tcpServer deja existants + 1" qui sera dedie a communiquer avec le client en question.

    Tu as egalement 2 textbox, si j'ai bien compris le controle TxtData sert a taper les donnees que tu veux envoyer vers les clients. Sauf erreur de ma part, tu n'as pas precise si tu voulais envoyer les memes donnees a tous les clients ou des donnees independantes en fonction des clients, dans le deuxieme cas, il faudrait creer un nouveau TxtData d'indice "nombre de tcpServer deja existants + 1" egalement. Au passage j'aurais d'ailleurs appele ce controle TxtOut puisque ce sont des donnees qui sortent pour le serveur et je ne mettrais pas l'envoi des donnes dans l'evenement change car a chaque ajout de caractere tu renvois toute la chaine presente.

    Meme doute pour moi en ce qui concerne l'affichage des donnees recues des clients, tu veux tout afficher dans une seule textbox ou dans une textbox par client ? Pour le nom, je mettrais TxtIn (donnees entrantes vues du serveur) et il faudrait creer des TxtIn indexes la aussi si tu veux un affichage de donnees par client.

    Petite "astuce", en mode creation, met le nom de tes textbox comme proprietes Text de ces memes TextBox (TxtIn(0)" par exemple, ca permet simplement en regardant la feuille de savoir comment s'appelle tes controles

  20. #20
    Membre régulier Avatar de Ramdoulou
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 286
    Points : 107
    Points
    107
    Par défaut
    Ah oui j'avais même pas fait attention, merci bien ca marche !

    Et concernant je l'ai supprimé et ça ne change rien, j'ai remplacé par txtSendData, mais ya une erreur comme quoi je n'ai pas declaré la procédure...donc comment je dois m'en servir à ce moment là ? =o

Discussions similaires

  1. Utilisation du control winsock
    Par abdallah dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 02/08/2006, 19h55
  2. [VBA-A] licence du controle winsock?
    Par djoodjoo555 dans le forum VBA Access
    Réponses: 14
    Dernier message: 28/05/2006, 15h33
  3. [Etudes] [CNAM] Questions pratiques Cycle Ingé
    Par monsterfab dans le forum Etudes
    Réponses: 9
    Dernier message: 28/03/2006, 16h16
  4. Index : théorie et pratique
    Par schlitters dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 11/01/2006, 19h02
  5. [Architecture] De la théorie à la pratique ...
    Par JMLJ dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 24/06/2005, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo