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#] Problème client-serveur TCP


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut [C#] Problème client-serveur TCP
    Bonjour à tous !

    J'ai un petit problème lors du retour de réponse d'un serveur à un client.

    J'ai deux fenêtres, une fenêtre qui symbolise le serveur et une le client.

    Voilà le code du serveur et du client:

    Le 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    namespace WindowsApplication1
    {
        public partial class serveur : Form
        {
            public string DEMANDE;
            TcpClient client = null;
            public serveur()
            {
                InitializeComponent();
            }
     
            private void StartServeur()
            {
                IPHostEntry host = new IPHostEntry();
                IPAddress[] IPS = host.AddressList;
                int PortEcoute = 9567;
     
                TcpListener S = new TcpListener(PortEcoute);
                S.Start();
                bool End = false;
     
                while (!End)
                {
                    client=S.AcceptTcpClient();
                    Thread T1 = new Thread(new Service(client).Run);
                    T1.Start();
                }
            }
     
            private void Throw_Serveur(object sender, EventArgs e)
            {
                Thread T0 = new Thread(new ThreadStart(StartServeur));
                T0.Start();
     
            }
        }
    }
    et a classe service:
    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
     
    namespace WindowsApplication1
    {
        class Service
        {
            TcpClient LiaisonClient;
            public Service(TcpClient LiaisonClient)
            {
                this.LiaisonClient = LiaisonClient;
     
            }
            public void Run()
            {
                StreamReader str = new StreamReader(LiaisonClient.GetStream());
                StreamWriter stw = new StreamWriter(LiaisonClient.GetStream());
     
                string demande;
                string reponse;
                demande = str.ReadLine();
                reponse = demande;
                stw.WriteLine(reponse);
                MessageBox.Show(demande);
            }
        }
    }


    Et le 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
    38
     
    namespace WindowsApplication1
    {
        public partial class client : Form
        {
            public string demande;
            public string reponse;
            public bool fini = false;
            public TcpClient C;
            public StreamReader In;
            public StreamWriter Out;
     
     
            public client()
            {
                InitializeComponent();
                this.C = new TcpClient("127.0.0.1",9567);
     
                this.In = new StreamReader(C.GetStream());
                this.Out = new StreamWriter(C.GetStream());
                this.Out.AutoFlush = true;
     
            }
            public void Envoi(string Text)
            {
                this.demande = Text;
                Out.WriteLine(demande);
                reponse = In.ReadLine();
                label1.Text = label1.Text + reponse.ToString() + "\n";
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                Envoi(this.textBox1.Text.ToString());
            }
     
        }
    }

    Mon problème est le suivant:
    - Lorsque je ne renvois pas de réponse au client (quand il m'envoit un message) (et donc lorsque je n'attends pas de réponse su côté client) Tout marche bien , pas de problème
    - Mais lorsque j'attends une réponse du côté client, je suis complétement bloqué ! mes fenêtre se bloquent ...

    Comment remédier à ce problème ? Faut il que j'attende la réponse du côté client dans un nouveau thread ???

    Meric pour vos réponses !!!!

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 30
    Par défaut
    Bonjour,
    Tout d'abord une petite question : pourquoi utilise tu le "tcpClient" plutôt que les sockets ...?

    Sinon pour ton problème, c'est normal, il s'agit de fonctions bloquantes ...
    Dans le cas des sockets il existe pour un équivalent de "Connect" (bloquant comme dans ton cas) qui est BeginConnect qui permet de se connecter en mode asynchrone et d'éviter ce genre de problèmes ....

    Voilà, en tout cas pour ce qui est de tcpclient, j'ai regardé vite fait, je ne vois rien de tel !


    Pour ta solution du thread séparé .... si jamais tu commence à prendre tes infos de connexion dans des textbox de ton form principal par exemple, tu vas devenir fou !!! (utilisation de pleins de delegate)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Re-bonjour Pierre1256

    J'ai utilisé TCPClient() car je n'ai pas trouvé de tutoriel sur les sockets en C#.
    Quelle est la différence finalement

    Pour le thread séparé, je pensais suivre les informations que tu m'as donné dans la "discussion" sur la "progressBar marquee". Déclarer une variable public dans le thread principal et à laquelle les autres thread pourront accéder ...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Toujours en utilsant TCPClient(), je pense avoir résolu mon problème de blocage en utilisant les thread.

    Voilà le script du 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
    38
    39
     
    namespace ClientServeur
    {
        public partial class client : Form
        {
            public TcpClient C = null;
            public StreamReader str = null;
            public StreamWriter stw = null;
            public bool End = false;
     
            public string demande;
            public string reponse;
            public client()
            {
                InitializeComponent();
                C = new TcpClient("127.0.0.1", 5769);
                str = new StreamReader(C.GetStream());
                stw = new StreamWriter(C.GetStream());
                stw.AutoFlush = true;
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                demande = textBox1.Text.ToString();
                stw.WriteLine(demande);
                new Thread(new ThreadStart(WaitResponse)).Start();
            }
            private void WaitResponse()
            {
                    reponse = str.ReadLine();
                    MessageBox.Show("Reponse du serveur" + reponse);
                    if (reponse == "eof" || reponse == "")
                    {
                        MessageBox.Show("END");                    
                    }
            }
     
        }
    }

    Et celui du serveur divisé en deux parties (démarrage serveur et lancement du thread du service qui traite les messages reçus)
    serveur.cs:
    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
     
    namespace ClientServeur
    {
        public partial class serveur : Form
        {
            TcpListener S = null;
            TcpClient C = null;
            bool End = false;
            public int Port = 5769;
            public serveur()
            {
                InitializeComponent();
                new Thread(new ThreadStart(StartServeur)).Start();
     
            }
     
            private void button2_Click(object sender, EventArgs e)
            {
                End = true;
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                S.Start();
            }
            private void StartServeur()
            {
                  S = new TcpListener(Port);
                  S.Start();
                    C = S.AcceptTcpClient();
                    new Thread(new ThreadStart(new service(C).Run)).Start();
            }
        }
    }
    et service.cs:
    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
     
    namespace ClientServeur
    {
        class service
        {
            public TcpClient LiaisionClient = null;
            public StreamReader str = null;
            public StreamWriter stw = null;
            public bool End = false;
            public string demande;
            public string reponse;
            public service(TcpClient LC)
            {
                this.LiaisionClient = LC;
            }
            public void Run()
            {
                this.str = new StreamReader(LiaisionClient.GetStream());
                this.stw = new StreamWriter(LiaisionClient.GetStream());
                while (!End)
                {
                    //Lecture
                    demande=str.ReadLine();
                    //Traitement
                    MessageBox.Show(demande);
                    reponse = demande;
                    //Ecriture
                    stw.WriteLine(reponse);
                    stw.AutoFlush = true;
                    if (demande == "eof")
                    {
                        End = true;
                    }
                }
                LiaisionClient.Close();
                MessageBox.Show("Service Arrêté");
     
            }
        }
    }

    Comme ceci ça fonctionne, je peux émettre un message au serveur qui répond au client en lui renvoyant le message qu'il a reçu.

    Maintenant, je vais avoir un gros problème comme tu as du y pensé pierre1256, je n'avais pas compris ce que tu me disais dans le précédent post
    A la base, je veux faire ce genre de chose pour uploader plusieurs fichiers et savoir combine de bytes j'ai transmis et faire avancer une progressBar.
    Or, ayant déjà eu le problème ... , je sens que je vais galéré pour accéder à ma progressbar à partir de la fonction WaitReponse() de mon client. Effet, cette fonction qui récupère une réponse du serveur pourrait me permettre de faire avancer une progressBar mais elle est lancée dans un autre thread
    Comment faire alors ?? Avez vous une autre idée pour avancer cette barre de progression ???

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 238
    Par défaut
    Pour acceder a ta Progress bar je te propose deux méthodes différentes:

    1 - Soit tu crée un BackGroundWorker. C'est un objet super pratique, ca remplace un Thread et ca donne certaines méthodes très pratique pour accéder au progress bar notamment. Je te conseil de regarder cet objet.

    2 - Soit tu garde ta structure actuelle et tu ajoute cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CheckForIllegalCrossThreadCalls = false
    Ca va te permettre d'acceder à une form depuis un thread.

    Bonne chance

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    GEEEEEENNNIIIAALLLL

    ça marche !!!!! Meric beaucoup Biloutor
    J'ai utliser la seconde méthode que tu m'a proposé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CheckForIllegalCrossThreadCalls = false
    Et ça fonctionne très bien.

    Je jetterai un coups d'oeil sur backgroundworker, ce n'est pas la première fois qu'on m'en parle.

    Merci encore

    Bonne journée à vous !

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

Discussions similaires

  1. [C] Probleme avec socket client-serveur TCP
    Par LinuxUser dans le forum Réseau
    Réponses: 33
    Dernier message: 15/05/2007, 22h26
  2. Aide Client/Serveur TCP //Commentaire
    Par sebounty dans le forum Réseau
    Réponses: 1
    Dernier message: 27/04/2007, 09h19
  3. [Reseau] probleme client/serveur TCP LInux
    Par jmjmjm dans le forum Réseau
    Réponses: 20
    Dernier message: 03/12/2006, 19h32
  4. Réponses: 1
    Dernier message: 11/05/2006, 11h46
  5. client/serveur tcp/ip en c sous unix
    Par oclone dans le forum Développement
    Réponses: 8
    Dernier message: 19/04/2005, 18h55

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