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

  1. #1
    Membre à l'essai
    VB.NET - SOCKET - envoyer le contenu d'une liste ou d'une listbox Via TCP
    Bonjour à tous! je viens quérir votre aide car j'avais une question!
    J'ai commencé récemment à utiliser le transfert de strings via TCP (TCPlistener, Socket, TCPClient et tout le tintouin ). Monter un serveur et un client, ça pas de souci, envoyer une info, pas de souci. Ma question est toute bête: dans le cadre d'un petit projet que je débute tout juste, j'aurais aimé transférer le contenu d'une listbox (ou d'une sans doute d'une liste déclarée dans le style: )
    Code VB.NET :Sélectionner tout -Visualiser dans une fenêtre à part
    Dim MaList as new list (of String)

    dans le but de l'envoyer dans une liste box ou une vabriable déclarée comme "list" du côté du client.

    1) est-ce possible, et si oui, comment? Pour l'instant, pour du textuel, j'utilisais quelque chose du style:
    Code VB.NET :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    Dim sendbytes() As Byte = System.Text.Encoding.ASCII.GetBytes(AEnvoyer.ToString)
    Socketz.Send(sendbytes)


    2) Faut-il prendre les infos de la liste une à une et boucler?
    3) Y-a t- il, de manière générale, moyen d'envoyer par ce procédé autre chose que des strings? Car côté client, je retombe sur du Getstring sur tous les exemples que j'ai pu voir.
    Code VB.NET :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    Dim rcvbytes(TcpClientz.ReceiveBufferSize) As Byte
    TCPClientStream.Read(rcvbytes, 0, CInt(TcpClientz.ReceiveBufferSize))
    CatchMessage = System.Text.Encoding.ASCII.GetString(rcvbytes)


    Sans doute est-ce une question de débutant, et peut être cela peut-il sembler stupide, mais j'aimerais progresser§ Il y a peut-être tout simplement quelque chose que je n'ai pas compris.

    Merci par avance pour votre aide et votre indulgence! Bonne soirée!

  2. #2
    Expert éminent sénior
    de nos jours il y a les webservices qui permettent de s'occuper de tout ca à la place du développeur
    après si tu as un interet à le faire toi même en tcp pur ca reste faisable

    il y a plusieurs types de webservices, mais dans le principe il y a toujours une méthode d'un côté qui attend des paramètres et qui peut retourner une valeur (comme une fonction en fait)
    donc genre côté client tu pourrais écrire SendSelectedClients(listboxClients.SelectedItems) et que "le framework de webservice" s'occupe de découper l'info en octets, et que la méthode côté serveur s'exécute à partir de la collection reconstituer
    ce qui permet au développeur ne pas avoir à écrire le code de découpage, le code d'envoi, le code d'appel etc...

    il y a wcf (complexe et bientôt abandonné), grpc (utilisable en .net, en vogue car performant et pas trop complexe), http rest et surement d'autres
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre à l'essai
    Merci Pol63 pour ta réponse! désolé pour le retard de la mienne!

    J'ai opté pour une technique de balayage de la listbox. je me suis fait deux sub routines (une pour l'envoi, une pour la réception) dont une que je devrais faire fonctionner comme une fonction (comme tu le disais). ici, j'ai déclaré une variable globale en début de code pour récupérer le message. Du coup:

    -Coté serveur: j'envoie une info (stockée dans une variable "AEnvoyer") et j'attend un accusé du client:
    Code VB.NET :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = 1 To MaListe.Count
          EmissionServeur(ListeNoms(i - 1))
          AttenteAccuseServeur()
    Next


      Ici, ma routine pour envoyer mes infos (stockées dans une variable "AEnvoyer"):

    Code VB.NET :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub EmissionServeur(ByVal AEnvoyer) 
       Dim sendbytes() As Byte = System.Text.Encoding.ASCII.GetBytes(AEnvoyer.ToString)
       Socketz.Send(sendbytes)
     
    End Sub



      Et là, celle pour recevoir infos et accusés de réception. Le message ou l'accusé sont stockés dans "CatchMessage"

    Code VB.NET :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
        Sub AttenteAccuseServeur()
     
            Dim temoin = 0
            Do Until temoin = 1
     
                If SocketStream.DataAvailable = True Then
     
                    Dim rcvbytes(Socketz.ReceiveBufferSize) As Byte
                    SocketStream.Read(rcvbytes, 0, CInt(Socketz.ReceiveBufferSize))
     
                    CatchMessage = System.Text.Encoding.ASCII.GetString(rcvbytes)
     
                    temoin = 1
     
     
                End If
            Loop
     
        End Sub


    -Coté client, je récupère les infos et envoie un accusé de réception:
    Code VB.NET :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 1 To 18
        AttenteAccuseClient()
        MaListe.Add(CatchMessage)
        EmissionClient("Reçu")
    Next


      Ma routine pour récupérer accusés ou infos dans ma variable CatchMessage (le prochain coup, je la définierai comme fonction)

    Code VB.NET :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
    Sub AttenteAccuseClient()
     
            Dim temoin = 0
            Do Until temoin = 1
     
                If TCPClientStream.DataAvailable = True Then
     
                    Dim rcvbytes(TcpClientz.ReceiveBufferSize) As Byte
                    TCPClientStream.Read(rcvbytes, 0, CInt(TcpClientz.ReceiveBufferSize))
     
                    CatchMessage = System.Text.Encoding.ASCII.GetString(rcvbytes)
     
                    temoin = 1
                End If
            Loop
     
    End Sub


      Ma routine pour envoyer infos et accusés

    Code VB.NET :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub EmissionClient(ByVal Aenvoyer)
       Dim sendbytes() As Byte = System.Text.Encoding.ASCII.GetBytes(Aenvoyer.ToString)
       TcpClientz.Client.Send(sendbytes)
    End Sub


    Je suis pas sûr que ce soit très académique mais... Ça marche et c'est plutôt pratique. Je pense que je vais jeter un oeil au techniques dont tu m'as parlées. N'étant pas un expert de la chose, j'aurai bien besoin de passer par la case apprentissage. Mais bon, on a rien sans rien. J'aime bien mettre les mains dans le camboui, je trouve que ça aide à comprendre comment ça marche. Pour ce que je fais dans ce programme, ça suffit bien (je suppose que je me ferais crucifier par le premier informaticien venu, mais bon... Il faut bien commencer quelque part!) Le seul bémol est que je dois savoir avant la transmission combien d'infos je vais envoyer. Je pense que je pourrais facilement parer à cela en envoyant via un premier message une info du genre ListBox1.Count pour que le client sache combien d'éléments je vais envoyer.

    Merci pour tout!

    Bon courage (et bon confinement si vous étiez confinés!)

    Chimere28 (A.k.a "lorsque la manière fine ne vient pas à toi, essaie la manière brute" )

  4. #4
    Expert éminent sénior
    Citation Envoyé par chimere28 Voir le message
    J'aime bien mettre les mains dans le camboui, je trouve que ça aide à comprendre comment ça marche.
    tout à fait
    après quand on a pas le temps ou pas le niveau et qu'on veut un truc pas trop buggé c'est bien de prendre des trucs tout fait

    par exemple en tcp il y a une limite de taille à partir de laquelle un envoi est découpé en plusieurs paquets, et techniquement ca peut déjà découper avant cette limite dans certains cas
    donc quand tu fais un SendBytes (plein d'octets), de l'autre côté tu vois DataAvailable à true, tu récupères tous les octets, mais rien de garantie que tout le bloc envoyé soit arrivé en entier
    en exagérant si tu envoies les octets du string "test", tu pourrais recevoir "t" puis "es" puis "t" en 3x
    il faut donc un mécanisme pour recoller les morceaux, et identifier un message entier

    le protocole http par exemple (qui utilise tcp) a une entête de message, avec l'info de content-size permettant de savoir combien d'octets fait le message entier
    d'autres protocoles se base sur un identifiant de début ou de fin de message (quand on a plusieurs types de messages c'est bien d'avoir un identifiant au début pour savoir ce qu'on doit faire avec ce qu'on reçoit)

    bref si tu veux faire un logiciel qui sera utilisé et qui doit être fiable ca va demander un peu de temps ^^
    Cours complets, tutos et autres FAQ ici : C# - VB.NET