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 :

TcpClient et TcpListener - Se connecte une seule fois


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de deejay2221
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 98
    Par défaut TcpClient et TcpListener - Se connecte une seule fois
    Bonjours.

    C'est encore moi, pour encore des questions sur les sockets Il faut croire que la réseautique ce n'est pas mon fort.

    Je me suis créé une classe MyTcpListener et MyTcpClient. Avec ces classes je me créer un serveur qui écoute et un client qui envoye des message en boucle.

    Le problème est que le serveur ne capte qu'un seul message et ensuite il attend pour je ne sais pas quoi. De son côté, le client réussi à envoyer le message qu'une seule fois et ensuite, il ne trouve pas le serveur.

    mes classes :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
        public class ClTcpListener
        {
            string m_ipEcoute;
            int m_port;
            TcpListener m_serveur;
            TcpClient m_client;
            NetworkStream m_stream;
     
            public ClTcpListener(string p_ipEcoute, int p_port)
            {
                m_ipEcoute = p_ipEcoute;
                m_port = p_port;
            }
     
            public bool Initialiser()
            {
                try
                {
                    IPAddress localAddr = IPAddress.Parse(m_ipEcoute);
                    m_serveur = new TcpListener(localAddr, m_port);
                    m_serveur.Start();
     
                    m_client = m_serveur.AcceptTcpClient();
                    m_stream = m_client.GetStream();
                }
                catch (SocketException e)
                {
                    return false;
                }
                return true;
            }
     
            public bool Terminer()
            {
                try
                {
                    m_client.Close();
                    m_serveur.Stop();
                }
                catch (Exception e)
                {
                    return false;
                }
                return true;
            }
     
            public Byte[] Ecouter(int p_longueur)
            {
                Byte[] bytes = null;
     
                try
                {
                    Initialiser();
     
                    // Buffer for reading data
                    bytes = new Byte[p_longueur];
     
                    int i;
                    if ((i = m_stream.Read(bytes, 0, bytes.Length)) == 0)
                        return null;
                    Console.WriteLine("code - " + i.ToString());
                }
                catch (SocketException e)
                { }
     
                return bytes;
            }
     
            public static string TransformerEnString(Byte[] p_bytes)
            { 
                return (System.Text.Encoding.ASCII.GetString(p_bytes));
            }
        }
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
        public class ClTcpClient
        {
            string m_host;
            int m_port;
            TcpClient m_client;
            NetworkStream m_stream;
     
            public ClTcpClient(string p_host, int p_port)
            {
                m_host = p_host;
                m_port = p_port;
            }
     
            public bool Initialiser()
            {
                try
                {
                    m_client = new TcpClient(m_host, m_port);
     
                    m_stream = m_client.GetStream();
                }
                catch (Exception e)
                {
                    return false;
                }
                return true;
            }
     
            public bool Terminer()
            {
                try
                {
                    m_client.Close();
                }
                catch (Exception e)
                {
                    return false;
                }
                return true;
            }
     
            public bool EnvoyerTexte(string p_texte)
            {
                Byte[] message = System.Text.Encoding.ASCII.GetBytes(p_texte);
                return EnvoyerBytes(message);
            }
     
            public bool EnvoyerBytes(Byte[] p_bytes)
            {
                try
                {
                    m_stream.Write(p_bytes, 0, p_bytes.Length);
     
                    m_client.Close();
                }
                catch (Exception e)
                {
                    return false;
                }
                return true;
            }
        }
    mon programme :
    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
        class Program
        {
            Bitmap m_derniereImage = null;
     
            static void Listener()
            {
                ClTcpListener listener = new ClTcpListener("192.168.123.149", 5656);
                if (!listener.Initialiser())
                    Console.WriteLine("Erreur lors de l'initialisation");
                else
                {
                    Byte[] message;
                    while (true)
                    {
                        message = listener.Ecouter(32);
                        if (message != null)
                            Console.WriteLine("Reçu : " + ClTcpListener.TransformerEnString(message));
                    }
     
                }
                listener.Terminer();
            }
     
            static void Client()
            {
                ClTcpClient client = new ClTcpClient("(monnomdedomaine).com", 5656);
                client.Initialiser();
                while (true)
                {
                    Console.Write(System.DateTime.Now.ToString());
                    if (client.EnvoyerTexte("salut"))
                        Console.Write(" - ok\n");
                    else
                        Console.Write(" - erreur\n");
                    Thread.Sleep(200);
                }
                client.Terminer();
            }
     
            static void Main(string[] args)
            {
                // Je met en commentaire un ou l'autre pour lancer soit le serveur, soit le client
                Listener();
                //Client();       
     
                // Pause avant la fermeture du programme
                Console.Read();
            }
        }
    Merci

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Comme ça, je dirais que c'est la fermeture du stream dans la méthode EnvoyerBytes de la classe ClTcpClient qui fout la zone, puisque pour l'écriture suivante le flux n'existe plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public bool EnvoyerBytes(Byte[] p_bytes)
    {
        try
        {
            m_stream.Write(p_bytes, 0, p_bytes.Length);
            //m_client.Close(); <-- essaye sans cette ligne
        }
        catch (Exception e)
        {
            return false;
        }
        return true;
    }
    Au passage, avec le traitement dans ton catch tu masques les exceptions, pas pratique pour déboguer après ^^

  3. #3
    Membre confirmé Avatar de deejay2221
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 98
    Par défaut
    OH MY GOD OH MY GOD !!!
    Ça marche

    Merci mille fois

    Wow quel erreur d'innatention

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

Discussions similaires

  1. [Configuration] filtrer le flux sortant une seule fois, en debut de code...
    Par misstinkiete dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 13/10/2005, 21h20
  2. [DLL] Ma DLL execute le Timer une seul fois !
    Par TOTO32 dans le forum Langage
    Réponses: 14
    Dernier message: 13/08/2005, 20h37
  3. Réponses: 1
    Dernier message: 19/03/2005, 22h47
  4. Réponses: 18
    Dernier message: 10/02/2005, 13h22
  5. Réponses: 2
    Dernier message: 30/11/2004, 11h48

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