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

Windows Forms Discussion :

[C#] Comment utiliser correctement Stream.Read ?


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 23
    Points
    23
    Par défaut [C#] Comment utiliser correctement Stream.Read ?
    Bonjour,

    Comme indiqué dans le topic, j'ai un problème avec la classe stream et la méthode Read. Je me connecte à un serveur qui selon les commandes que je lui soumet me répond avec une ou plusieurs lignes.

    Le problème est que si je ne met qu'une ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     int k=stm.Read(bb,0,4096);
    où stm est mon stream et bb mon buffer, et que le serveur me renvoie plusieurs lignes lors de mon prochain appel à Read, je récupererai la fin des lignes renvoyé à la commande précédente et non la (ou les) lignes de la commande que je viens de lancer.

    De ce que j'ai pu découvrir, la méthode Read lit les réponses serveur. Si il y en a une, il la récupere et la retourne mais si il n'y a rien à lire cette méthode attend...

    Comment faire pour que le prog s'adapte automatiquement au nombre de ligne retourné par le serveur?

    PS: je n'ai pas accés au serveur, il est indépendant de mon appli...

    Merci par avance

    Julien

  2. #2
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Tu devrais peut être utilisé un BinaryReader
    qui te permettrait de faire une boucle du type
    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
     
    BinaryReader MyReader = null;
    try
    {
       MyReader = new BinaryReader(stm);
       while(MyReader.PeekChar() <> -1)
       {
          bb = MyReader.ReadBytes(bb.Length);
          //traitement de bb
       }
    catch(Exception e)
    {
        //traiter e.Message;
    }
    finally
    {
       if(MyReader != null)
         { MyReader.Close();}
    }
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  3. #3
    Membre à l'essai
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    j'ai essayé ton morceau de code mais cela ne marche pas.

    Voilà le code que j'ai :

    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
     
    private string SendToServer(string str, string errString)
            {
                string sResponse = "";
                Stream stm = tcpCli.GetStream();
                ASCIIEncoding asen = new ASCIIEncoding();
                byte[] ba = asen.GetBytes(str);
     
     
                stm.Write(ba, 0, ba.Length);
     
                byte[] bb = new byte[4096];
     
                int k = stm.Read(bb, 0, 4096);
     
     
                k = stm.Read(bb, 0, 4096);
                for (int i = 0; i < k; i++)
                    sResponse += Convert.ToChar(bb[i]).ToString();
                sResponse = "";
                k = stm.Read(bb, 0, 4096);
                for (int i = 0; i < k; i++)
                    sResponse += Convert.ToChar(bb[i]).ToString();
                sResponse = "";
                k = stm.Read(bb, 0, 4096);
                for (int i = 0; i < k; i++)
                    sResponse += Convert.ToChar(bb[i]).ToString();
                sResponse = "";
                k = stm.Read(bb, 0, 4096);
                for (int i = 0; i < k; i++)
                    sResponse += Convert.ToChar(bb[i]).ToString();
                sResponse = "";
                k = stm.Read(bb, 0, 4096);
                for (int i = 0; i < k; i++)
                    sResponse += Convert.ToChar(bb[i]).ToString();
                sResponse = "";
                k = stm.Read(bb, 0, 4096);
                for (int i = 0; i < k; i++)
                    sResponse += Convert.ToChar(bb[i]).ToString();
     
                return sResponse;
     
            }
    Ceci est la méthode que je me sert pour recuperer une des réponses du serveur car je sais qu'à ce moment il m'envoie autant de ligne que j'ai de stm.Read...
    Mais bon, cela ne fait pas classe comme code. J'aimerai pouvoir le faire dans une boucle mais je n'ai toujours pas réussi à le faire...

    Quelqu'un à une idée?

    Julien

  4. #4
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Je suppose donc que tu utilises un TcpClient si j'ai bien compris (déclaré au niveau de la classe et auquel je suppose tu as attribué tes valeurs pour les propriétés .SendBufferSize et .ReceiveBufferSize

    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
     
    private string SendToServer(string str, string errString) 
    {
       NetworkStream nS = tcpCli.GetStream ();
       string sResponse = String.Empty; 
       if (nS.CanWrite)
       {
          byte[] sendB = New ASCIIEncoding().GetBytes(str); 
          nS.Write (sendB, 0, sendB.Length);
       }
       else
       {
          //message d'alerte +
          nS.Close ();
          return sResponse;
       }
     
       if (nS.CanRead)
       {
          byte[] responseB = new byte[tcpCli.ReceiveBufferSize];
          nS.Read (responseB , 0, (int) tcpCli.ReceiveBufferSize);
     
          sResponse = New ASCIIEncoding().GetString(responseB);
          return sResponse;
       }
       else
       {
          //message d'alerte +
          nS.Close ();
          return sResponse;
       }
    }
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  5. #5
    Membre à l'essai
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    bon j'ai essayé ton code. Le programme ne se bloque pas mais il ne lit que la première ligne envoyée par le serveur (c'est à dire jusqu'au "\r\n").

    J'ai donc essayé de modifier comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
    while (nS.CanRead) {
                    byte[] responseB = new byte[tcpCli.ReceiveBufferSize];
                    nS.Read(responseB , 0, (int) tcpCli.ReceiveBufferSize);
                    sResponse = new ASCIIEncoding().GetString(responseB);
                    Console.WriteLine(sResponse);
                    return sResponse;
                }
    Remplacement du if(nS.CanRead) par un while mais à ce moment là le prog se coince. (Il passe une premiere fois pour lire la premiere ligne mais ne lit pas la suite et se bloque)

    Je suis dégouté car je pensai qu'avec la méthode CanRead ca marcherai

    J'ai essayé aussi avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while (nS.DataAvailable) {
         // le code de traitement
    }
    Mais là le prog ne rentre meme pas dans la boucle...

    Comment faire?

    Julien

  6. #6
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par ArChAnGe76
    bon j'ai essayé ton code. Le programme ne se bloque pas mais il ne lit que la première ligne envoyée par le serveur (c'est à dire jusqu'au "\r\n").
    pour l'instant ne fait pas de boucle sur le CanRead, laisse la conditionnelle tel quel, on verra s'il est necessaire de boucler à l'intérieur plutôt
    il faudrait verifier la valeur de nS.Length juste avant le Read stp
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  7. #7
    Membre à l'essai
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Alors j'ai fait ce que tu ma dit betement et je me suis aperçu d'une petite chose :

    Voici le "summary" de la méthode Length d'un NetworkStream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Gets the length of the data available on the stream. This property is not
            //     currently supported and always throws a System.NotSupportedException.
    Donc impossible de savoir la longueur des données à lire...

    Sinon voici la sortie console de la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a002 Select Inbox //message envoyé au serveur
     
    //entrée dans le if
    * FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent) //réponse serveur
    Julien

    p.s : je travaille sous vs 2005 express et le framework 2.0 si ca peut aider

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 16/08/2007, 11h40
  2. [D6] Comment utiliser correctement TOutlookApplication ?
    Par PomaH dans le forum Web & réseau
    Réponses: 6
    Dernier message: 11/07/2007, 11h01
  3. Comment utiliser le streaming avec en .flv
    Par pierrot10 dans le forum Flash
    Réponses: 3
    Dernier message: 21/10/2006, 17h38
  4. comment utiliser correctement les sessions?
    Par cladsam dans le forum Langage
    Réponses: 5
    Dernier message: 06/02/2006, 11h56
  5. Comment utiliser correctement le debugger de DevCPP
    Par Le Furet dans le forum Dev-C++
    Réponses: 2
    Dernier message: 29/09/2005, 09h56

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