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

C# Discussion :

Problème de hashage en lecture d'un stream


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 84
    Points : 19
    Points
    19
    Par défaut Problème de hashage en lecture d'un stream
    Bonjour,

    Présentation du projet:
    Je travaille actuellement sur un projet consistant à créer un chat en c#. Pour cela, j'ai développé une IHM qui correspond à un client ainsi que mon serveur.
    Actuellement, un client peut communiquer avec tous les autres clients connectés au serveur.
    Maintenant j'aimerais pouvoir lister les différents clients connectés sur le serveur. Que le serveur envoit cette liste à chaque client (en l'actualisant). A partir de ce moment là, le client peut sélectionner un interlocuteur en particulier pour ne discuter que avec lui.

    Le point qui pose problème:
    J'enregistre les différents clients dans un Hashtable. Le Hashtable est constitué ainsi: une clé correspond à un indice (int) et est associé à une valeur correspondant au nom du client (string).
    J'envoie donc au client qui vient de se connecter la liste parcourant mon Hastable à l'aide d'un foreach. De plus, pour différencier un message "classique" du nom d'un utilisateur, je fais précéder le nom par un ?. Le problème étant que mon client récupère toutes les valeurs dans un seul string (à savoir ma variable correspondant à inStream).

    Voici mon code qui envoit la liste à un client (donc coté serveur):
    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
     public static void broadcastNewClient(TcpClient socket, bool flag)
            {
                TcpClient broadcastSocket;
                broadcastSocket = socket;
                foreach (DictionaryEntry Item in clientsList)
                {
                    int nb = clientsList.Count;
                    NetworkStream broadcastStream = broadcastSocket.GetStream();
                    string msg = "?" + Item.Key;
                    Byte[] broadcastBytes = null;
                    if (flag == true)
                    {
                        broadcastBytes = Encoding.ASCII.GetBytes(" says : " + msg);
                    }
                    else
                    {
                        broadcastBytes = Encoding.ASCII.GetBytes(msg);
                        Console.WriteLine("Le nom est: {0}", Item.Key);
                    }
                    broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length);
                    broadcastStream.Flush();
                }
    Voici mon code de réception coté client:
    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
    private void getMessage()
            {
                while (clientSocket.Connected)
                {
                    try
                    {
                        serverStream = clientSocket.GetStream();
                        int buffSize = 0;
                        byte[] inStream = new byte[10025];
                        buffSize = clientSocket.ReceiveBufferSize;
                        serverStream.Read(inStream, 0, buffSize);
                        serverStream.Flush();
                        string returndata = System.Text.Encoding.ASCII.GetString(inStream);
                        /****************************/
     
                        NameList.Items.Clear();
                        if (returndata.Substring(0, 1) == "?")
                        {
                            users[i] = returndata;
                            i++;
                        }
                        NameList.BeginUpdate();
                        for (int m = 0; m < i; m++)
                        {  
                            NameList.Items.Add(users[m]);  
                        }
                        NameList.EndUpdate();    
                        /****************************/
                        readData = "" + returndata;
                    }
                    catch (InvalidOperationException e) { Console.WriteLine("Invalid operation exception: {0}", e); }
                    catch (ArgumentNullException e) { Console.WriteLine("Argument null exception: {0}", e); }
                    catch (ArgumentOutOfRangeException e) { Console.WriteLine("Argument out of range exception: {0}", e); }
                    catch (IOException e) { Console.WriteLine("IOException: {0}", e); }
                    msg();
                }
            }
    Tout ceci m'amène à penser que je rencontre un problème dans ma lecture des données. Plus particulièrement, je pense que le problème vient du fais que la taille défini pour inStream (10025) est bien trop grand par rapport aux noms des utilisateurs. Qu'en pensez-vous? Auriez-vous d'autres idées?

    Par avance merci pour votre aide.

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 177
    Points : 5 738
    Points
    5 738
    Par défaut
    Pour ma part j'ai préférer ne pas spécifier de taille "fixe" pour le buffer et transmettre des objets sérialisés.
    Voici ma méthode de réception des données, si ça peut te donner des idées.

    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
    44
    45
    46
    47
    48
    49
    50
    51
            private void ReceiveDataServer()
            {
                byte[] databuffer;
                int buffersize;
                try
                {
                    while (true)
                    {
                        databuffer = new byte[512];
                        MemoryStream MemStream = new MemoryStream();
     
                        do
                        {
                            buffersize = NetworkStream.Read(databuffer, 0, databuffer.Length);
                            MemStream.Write(databuffer, 0, buffersize);
                        }
                        while (NetworkStream.DataAvailable && buffersize != 0);
     
                        if (buffersize == 0)
                        {
                            Debug.WriteLine("WARNING (client) : La connexion avec le serveur est perdu");
                            IsConnected = false;
                            if (OnCloseConnectionEventHandler != null) OnCloseConnectionEventHandler();
                            return;
                        }
     
                        byte[] data = MemStream.ToArray();
                        MSG_to_Client OMSG_to_Client = null;
                        try
                        {
                            OMSG_to_Client = RicoConverter.Deserialize<MSG_to_Client>(data);
                        }
                        catch
                        {
                            Debug.WriteLine("Erreur (client) : Un packet n'était pas conforme");
                            return;
                        }
     
                        if (OnReceiveEventHandler != null) OnReceiveEventHandler(OMSG_to_Client);
                    }
                }            catch (Exception ex)
                {
                    if (NetworkStream != null)
                    {
                        IsConnected = false;
                        if (OnCloseConnectionEventHandler != null) OnCloseConnectionEventHandler();
                    }
                    Debug.WriteLine("ERREUR (client) : Le serveur à été perdu" + ex.ToString());
                    return;
                }
            }

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 84
    Points : 19
    Points
    19
    Par défaut
    Merci de ta réponse. Bien que la solution que tu proposes est intéressante, elle me demande de faire un certain nombre de modifications je pense.

    En revanche, j'ai pensé à une autre solution:
    Etant donné que j'ai un ? à chaque nouveau nom, dans le string que j'obtiens, je peux réaliser une sorte de découpage à chaque fois que je repère un ?.
    Par conséquent, il faudrait que je puisse parcourir l'ensemble de mon string et faire la comparaison avec un caractère.
    Est-ce envisageable d'après vous?

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 177
    Points : 5 738
    Points
    5 738
    Par défaut
    Dans ce cas, converti ta string en tableau avec comme séparateur le '?'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                string str = "?abc?def?ghi";
                foreach (string item in str.Split('?'))
                    Console.WriteLine(item);
    Résultat :
    abc
    def
    ghi

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 84
    Points : 19
    Points
    19
    Par défaut
    J'ai utilisé effectivement cette solution. Merci beaucoup

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

Discussions similaires

  1. Problème en lecture de video streaming
    Par android84 dans le forum Android
    Réponses: 5
    Dernier message: 28/10/2011, 18h01
  2. Problème de lecture d'un stream dans une boucle
    Par Kerberos69 dans le forum VBScript
    Réponses: 3
    Dernier message: 09/03/2009, 20h43
  3. Problème de lecture dans un stream!
    Par chrono23 dans le forum C++
    Réponses: 27
    Dernier message: 16/06/2006, 13h08
  4. Problèmes de Hashages et de Tableaux
    Par Chris_LaFouine dans le forum Langage
    Réponses: 4
    Dernier message: 22/07/2005, 11h57
  5. [XSLT]Problèmes d'ordre de lecture et d'écriture
    Par leup dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 11/07/2005, 11h36

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