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

Visual Studio Discussion :

VB.NET - SOCKET - envoyer le contenu d'une liste ou d'une listbox Via TCP


Sujet :

Visual Studio

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2018
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2018
    Messages : 33
    Points : 21
    Points
    21
    Par défaut 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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    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
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2018
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2018
    Messages : 33
    Points : 21
    Points
    21
    Par défaut
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    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

Discussions similaires

  1. Envoyer le contenu d'une zone de texte par SMS
    Par étudiante_info dans le forum Android
    Réponses: 1
    Dernier message: 04/04/2011, 16h44
  2. Envoyer le contenu d'une listView par Mail
    Par floriaan60 dans le forum Windows Forms
    Réponses: 15
    Dernier message: 26/05/2008, 09h36
  3. Réponses: 2
    Dernier message: 02/11/2007, 18h12
  4. Réponses: 1
    Dernier message: 14/07/2007, 22h20
  5. [VB.NET][FlexGrid]Récupérer le contenu d'une cellule de FlexGrid
    Par kinganasius dans le forum Windows Forms
    Réponses: 1
    Dernier message: 06/06/2006, 17h11

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