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 :

Echange de données TCP-IP [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 258
    Par défaut Echange de données TCP-IP
    Bonjour,

    Je travaille sur une application qui doit traiter des messages d'un automate transmis via TCP-IP.
    Ne disposant pas de l'automate concerné j'ai créé un simulateur qui fournit un serveur TCP-IP envoie des messages types.
    La lecture du message côté client se fait nécessairement par StreamReader.Peek() car les Read() et ReadLine() ne fonctionnent pas sur les messages réels de l'automate.

    Le problème que je rencontre est que le buffer côté client ne se vide pas malgré la commande DiscardBufferedData() si bien que les messages s'ajoutent continuellement dans le buffer que je relis en entier à chaque fois.

    Voici un extrait résumé de la partie "serveur" du simulateur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
                  dim serverSocket as TcpListener = New TcpListener(IPAddress.Any, Integer.Parse(IP))
                   serverSocket.Start()
     
    dim client as TcpClient = serverSocket.AcceptTcpClient()
     
                   Dim networkStream As NetworkStream = client.GetStream()
                   If networkStream.CanWrite Then
                       Dim myWriteBuffer As Byte() = Encoding.UTF8.GetBytes(STX & message & ETX)
                       networkStream.Write(myWriteBuffer, 0, myWriteBuffer.Length)
                   Else
                       MsgBox("Echec de l'écriture TCP: CanWrite = false")
                   End If
    Et voici la partie réception du message par l'appication cliente:
    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
     
            Dim networkStream As NetworkStream = clientSocket.GetStream()
            Dim reader As New StreamReader(networkStream)
     
            While Continuer = True
     
                Try
                    Dim Message As String = ""
                    Do While reader.Peek() > 0
                        Dim c As Integer = reader.Read()
                        Message &= Chr(c)
                    Loop
                    reader.DiscardBufferedData()
     
                    If Message <> "" Then
    ...
    Merci de bien vouloir m'expliquer où est mon erreur, tous les exemples que je trouve ne font référence qu'à des lectures de fichiers textes, je n'ai pas trouvé d'exemple de lecture de flux TCP-IP.


  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    Est-ce que le problème ne vient pas plutôt de l'envoi du message, qui enverrai le message précédent en plus du message qui doit être envoyé ? En bref, vérifie que le message que tu envoies est le bon pour commencer.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 258
    Par défaut
    merci pour ta réponse rapide umfred, il s'agissait en fait d'un faux problème.
    A force de bidouiller je faisais n'importe quoi et je passais à côté de la vérité!
    Désolé pour le temps passé

    A la rigueur, si tu maitrise bien le sujet, peux-tu me confirmer que la commande reader.DiscardBufferedData() a bien pour effet de purger le contenu du buffer et que son utilisation comme présentée dans mon exemple est correcte ?


  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    à vu de nez c'est ni fait ni à faire

    le mieux reste d'utiliser beginread, le callback endread sera appelé dès qu'au moins un octet sera disponible (potentiellement plusieurs) (ou une coupure de la connexion faite)
    et les octets lus sont retirés de l'entrée (contrairement à peek)

    ca risque de te prendre qq heures le temps de comprendre tout ça, mais coder au hasard de ce qui semble fonctionner ... non ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    ça serait de connaitre la "vérité" qui a "résolu" le problème.

    De ce que je lis de la doc officielle, DiscardBufferedData n'est utile que si on manipule la position du StreamReader et/ou qu'on relit le stream. Comme il a un impact sur les performances, la méthode ne doit être utilisée que si nécessaire. Vu que l'on a une vision partielle de ton code, on ne sait pas si c'est utile ou pas, mais je dirais qu'a priori il est inutile.

    Le code que tu utilises est identique à celui proposé en exemple (sans le DiscardBufferedData)(c'est la page du Read, mais https://learn.microsoft.com/en-us/do...d?view=net-9.0

    @pol63 en fait, les données sont bien consommées avec le Read (le Peek permet de savoir si il y a quelque chose ou pas à lire)

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 258
    Par défaut
    Merci Pol63,
    En effet la programmation au hasard n'est pas recommandée!
    Je vais donc me pencher sérieusement sur beginread et sa suite

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/07/2016, 10h56
  2. Echange de donnes entre form et modalpoup
    Par rrbenez dans le forum ASP.NET
    Réponses: 2
    Dernier message: 18/12/2009, 12h01
  3. Echange des paquets TCP
    Par passkok dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 15/04/2009, 00h14
  4. echange de donnè via reseaux
    Par TheBlackReverand dans le forum VB.NET
    Réponses: 10
    Dernier message: 18/05/2007, 11h02
  5. echange de paquets (tcp)
    Par cortex024 dans le forum Développement
    Réponses: 1
    Dernier message: 03/10/2005, 21h40

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