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.NET Discussion :

Message client et récupération [Débutant]


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Problème de récupération de chaine
    Bonjour à tous,



    Je viens vers vous pour vous exposer un soucis que j'ai avec mon programme. En effet, j'essaie de créer un serveur pouvant communiquer avec plusieurs clients. Je ne m'occupe que de la partie Serveur. Les clients sont simulés avec un exécutable. Le tout fonctionne pas trop mal mais je bute sur un léger soucis dont je ne comprends même pas le problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                Dim d As System.Text.Decoder = System.Text.Encoding.UTF8.GetDecoder
                Dim charLen As Integer = d.GetChars(socketData.dataBuffer, 0, iRx, chars, 0)
                Dim szData As String = New String(chars)
                AppendToRichEditControl("Client " & socketData.m_clientNumber & " : " & szData)
                TBRep.Invoke(affTB2, szData)
     
                reponseTab(socketData.m_clientNumber) = TBRep.Text
    En gros, je récupère la donnée envoyée, je l'inscris dans ma textBox 'TBRep' puis je place dans mon tableau reponseTab, à la position clientNumber le contenu de cette TextBox.

    Plus tard dans mon code, je test cette valeur pour savoir si elle est égale à "OK" ou non. Cela marche très bien pour un client mais pour plusieurs, cela pose problème.



    De ce fait, j'ai voulu sauter l'étape d’inscription dans TBRep pour mettre directement dans mon tableau la donnée reçue. J'y parviens mais lors du test, ça ne fonctionne plus du tout.
    Afin de confirmer cela, j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                Dim d As System.Text.Decoder = System.Text.Encoding.UTF8.GetDecoder
                Dim charLen As Integer = d.GetChars(socketData.dataBuffer, 0, iRx, chars, 0)
                Dim szData As String = New String(chars)
                AppendToRichEditControl("Client " & socketData.m_clientNumber & " : " & szData)
                TBRep.Invoke(affTB2, szData)
     
                reponseTab(socketData.m_clientNumber) = TBRep.Text
                MsgBox(String.Equals(reponseTab(socketData.m_clientNumber), "OK"))
    Lorsque j'envoie "OK" de mon client, ma messageBox me confirme bien par 'True' que les chaines sont identiques, mon programme fait la suite.

    En revanche, si je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                Dim d As System.Text.Decoder = System.Text.Encoding.UTF8.GetDecoder
                Dim charLen As Integer = d.GetChars(socketData.dataBuffer, 0, iRx, chars, 0)
                Dim szData As String = New String(chars)
                AppendToRichEditControl("Client " & socketData.m_clientNumber & " : " & szData)
                TBRep.Invoke(affTB2, szData)
     
                reponseTab(socketData.m_clientNumber) = szData
                MsgBox(String.Equals(reponseTab(socketData.m_clientNumber), "OK"))
    Lorsque j'envoie "OK" de mon client, ma messageBox me retourne 'False' !



    J'ai mis exactement les mêmes variables dans les deux cas et j'ai bien envoyé "OK" de la même façon et du même client.

    Si quelqu'un a la réponse à ce petit problème, je suis preneur.

    Le code de mon invoke, au cas ou :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Private Delegate Sub affichText2(ByVal text As String)
        Private Sub textBox22(ByVal text As String)
            Me.TBRep.Text = text
        End Sub
        Private affTB2 As New affichText2(AddressOf textBox22)
    Merci d'avance.


    BB59

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Points : 455
    Points
    455
    Par défaut
    Salut,

    J'ai pas tout compris,
    Mais t'es tu arrété avec un point d'rret pour voir ce qu'il y avait des tes variables à ce moment ?

  3. #3
    Candidat au Club
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Je viens de le faire. J'ai bien "OK" dans ma variable mais False lors de la comparaison.

  4. #4
    Candidat au Club
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Message client et récupération
    Bonjour tout le monde,

    J'ai un petit soucis sur mon application : j'ai crée un serveur vers lequel se connecte des clients. Lors de cette connexion, le serveur attend de recevoir le message d'un client avant de poursuivre.

    Le problème, c'est qu'il ne reçoit pas le bon message.
    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                client.Receive(bytes, bytes.Length, 0)
                Dim message As String = System.Text.ASCIIEncoding.ASCII.GetString(bytes)
                MsgBox("A" & message & "A")
    Imaginons que mon client envoie 'OK', ma messageBox me retourne AOK.
    Ou est passé la suite ?
    comment se fait-il que je n'obtiens pas le A de fin ?

    Ce souci m’empêche de stocker la valeur correcte dans un tableau et de passer à la suite.

    Si quelqu'un pouvait m'aider, ce serait fort sympathique.

    BB59

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Une piste à explorer.

    Vérifiez que votre tableau bytes ne contient pas un caractère spécial à la fin de vos caractères (du genre vbNullChar, ou autre) genre fin de message.
    Exemple reproduisant votre bug
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Dim Data As String = New String("ok" & vbNullChar)
            MessageBox.Show("A" & Data & "A : non affiché")
    _____

    Voici une émulation (simplifié pour tester) de votre problème (basé sur votre sujet précédant : Problème de récupération de chaîne)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            Dim bytes() As Byte = {79, 75, 0}
            Dim chars(2) As Char
            Dim d As System.Text.Decoder = System.Text.Encoding.UTF8.GetDecoder
            Dim charLen As Integer = d.GetChars(bytes, 0, 3, chars, 0)
            Dim szData As String = New String(chars) ' la variable contient le caractère indésirable
            MessageBox.Show("A" & szData & "A : non affiché")
            TextBox1.Text = szData
            MessageBox.Show("A" & TextBox1.Text & "A : affiché")
    il faut donc vérifier le dernier caractère (voire l'avant dernier) et traiter seulement le nombre de caractère utile de votre tableau bytes pour l'affecter à votre variable szData. (avec le message OK => bytes(0):"O", bytes(1):"K", suivant si existe => inutile)

    Servez-vous de la fenêtre espion, regardez la taille du tableau bytes et observez quel sont les caractères constituant votre tableau.
    Peut-être qu'avec iRx - 1 cela suffit. (on ne sait pas comment vous déterminez iRx)
    [Edit]Par contre si le tableau chars n'est pas correctement dimensionné le problème persistera, cela peut aussi être une autre piste à vérifier. (c'est le cas dans mon exemple)[/Edit]
    Mon exemple corrigé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            Dim bytes() As Byte = {79, 75, 0}
            Dim chars(bytes.Length - 2) As Char
            Dim d As System.Text.Decoder = System.Text.Encoding.UTF8.GetDecoder
            Dim charLen As Integer = d.GetChars(bytes, 0, bytes.Length - 1, chars, 0)
            Dim szData As String = New String(chars)
    En espérant avoir pu vous aiguiller et vous apporter une aide, bonne prog.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  6. #6
    Candidat au Club
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Je teste ça.

    Effectivement, c'est lié à mon autre post ici même.
    Encore merci

  7. #7
    Candidat au Club
    Inscrit en
    Août 2013
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    J'ai l'impression que c'est résolu.
    L'idée que vous m'avez suggéré avec le 'vbNullchar' semble être la bonne.

    J'ai ajouté dans mon ancien code un Trim supprimant cet hypothétique vbNullChar :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    client.Receive(bytes, bytes.Length, 0)
    Dim message As String = System.Text.ASCIIEncoding.ASCII.GetString(bytes)
    message = message.Trim(CChar(vbNullChar))
    MsgBox("A" & message & "A")
    J'ai encore toute une série de tests à faire avant de crier victoire mais je suis confiant !

    Encore merci
    BB59

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    De rien,
    Pensez à mettre en résolu lorsque vous serez sur que tout fonctionne bien.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD9] Net Envoie Message Client
    Par beubeu51 dans le forum WinDev
    Réponses: 8
    Dernier message: 19/06/2012, 22h42
  2. Client AXIS, récupération de piéce jointe
    Par bannik dans le forum Services Web
    Réponses: 1
    Dernier message: 02/04/2009, 10h18
  3. Réponses: 3
    Dernier message: 02/03/2009, 22h34
  4. Socket envoi message Client/Serveur
    Par sebkill dans le forum C#
    Réponses: 27
    Dernier message: 28/05/2008, 22h34
  5. message client serveur
    Par ac/dc dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/10/2006, 17h01

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