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 :

code client serveur


Sujet :

C#

  1. #1
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut code client serveur
    Bonjour !

    j'ai un souci avec l'architecture client/serveur, le problème se pose au niveau du serveur, j'ai mis le code que vous allez voir par la suite dans un projet console application ben ca marchait très bien mais quand je voulais l'utiliser dans les winform ben ca bloque !!!
    voici le code 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
     
    namespace PCServeur
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
     
                /********** parametres de connexion ***********/
                IPHostEntry iphe = Dns.Resolve("localhost");
                IPEndPoint ipep = new IPEndPoint(iphe.AddressList[0], 1069);
                TcpListener s = new TcpListener(ipep);
                s.Start();
                TcpClient c = s.AcceptTcpClient(); // accepter un client
                label2.Text = "un pc connecté !";
                Stream str = c.GetStream();
                byte[] b = new byte[100];
     
                if (str.Read(b, 0, 50) != -1) //verifier s'il ya quelque chose dans le flux de donnees
                {
                    TextBox1.Text = Encoding.ASCII.GetString(b);
                }
     
                str.Close();
                c.Close();
     
            }
        }
    }
    il se bloque lors de l'exécution au niveau de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TcpClient c = s.AcceptTcpClient();
    j'ai essayé ce code dans un projet console application ca marche très bien, mais je crois que ce n'est pas la même chose car en mode console application l'exécution se fait ligne par ligne donc quand il arrive a l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TcpClient c = s.AcceptTcpClient();
    le serveur se met en attente, par contre dans le winform quand il arrive a cette exécution l'ordinateur se bloque !
    comment pour résoudre ce problème ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Par défaut
    Bonjour,

    c'est tout à fait normal que ton application se bloque lors de l'appel à AcceptTcpClient car cette méthode est bloquante le teps qu'un client se connecte.
    Pour contourner se problème, tu devrais regarder du coté des opérations asynchrones et de la méthode BeginAcceptSocket.

  3. #3
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    salut !

    oui je sais qu'il doit se bloquer pour attendre l'arrivé d'un client, en console ben c'est ce qu'il fait, en suite des qu'un client se connecte il continue.
    mais lorsque je ai mis ce code dans le constructeur de la forme ben il se bloque d'une façon anomale (ce n'est pas un blocage d'attente d'un client) d'ailleurs il ne m'affiche même pas la forme !!!

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Par défaut
    Ce qui est normal, vu que tu met ton programme en attente en plein milieu du constructeur du Form

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Regarde du coté des background worker.

    Pour laisser l'interface s'exécuter sans la planter.

  6. #6
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    Apparemment je n'arrive pas a très bien comprendre comment utiliser BeginAcceptSocket ni comment ca fonctionne si quelqu'un peut m'expliquer je serai très reconnaissant.

  7. #7
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    il me semble que personne ne pourrait m'aider ! j'aimerais juste comprendre
    1- pourquoi ca bloque tout ?
    2- y a t-il un moyen pour faire apparaitre la forme et attendre un client sans bloquer le tout ?!

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Par défaut
    Bonjour,

    Pour ce qui est du pourquoi du blocage, je ne peut rien dire de plus que je n'ai déjà dis.
    Pour l'utilisation du BeginAcceptTcpClient, voila ta classe refaite :

    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
     
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
     
                /********** parametres de connexion ***********/
                IPHostEntry iphe = Dns.Resolve("localhost");
                IPEndPoint ipep = new IPEndPoint(iphe.AddressList[0], 1069);
                TcpListener s = new TcpListener(ipep);
                s.Start();
                s.BeginAcceptTcpClient(AcceptTcpClientCallback, s);
            }
     
            private void AcceptTcpClientCallback(IAsyncResult e)
            {
                TcpListener s = (TcpListener)e.AsyncState;
     
                s.EndAcceptTcpClient(e);
                TcpClient c = s.EndAcceptTcpClient(e); // récupérer le client
                Invoke(new Action(delegate {
                              label2.Text = "un pc connecté !";
                }));
     
                Stream str = c.GetStream();
                byte[] b = new byte[100];
                if (str.Read(b, 0, 50) != -1) //verifier s'il ya quelque chose dans le flux de donnees
                {
                    Invoke(new Action(delegate {
                        TextBox1.Text = Encoding.ASCII.GetString(b);
                    }));
                }
     
                str.Close();
                c.Close();
            }
        }

  9. #9
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    c'est genialllllllllllll !! merci beaucoup beaucoup je suis super content je te jure

    ca marche !!!!

  10. #10
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    juste une petit question quand même, pour le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Invoke(new Action(delegate {}));
    je l'utilise a chaque fois que je veux faire appel a un élément de la forme ?

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Par défaut
    Pour modifier un élément graphique, il est préférable d'être dans le thread de l'interface utilisateur.
    Comme le principe des méthodes asynchrones, c'est de s'éxécuter dans un autre thread, il faut donc utiliser la méthode Invoke pour éxécuter le delegate sur le thread UI.
    Je sais que sans ce Invoke, la modification d'un élément graphique entraine une exception en mode debug.

  12. #12
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    salut !

    j'ai une autre question,
    j'excuste les deux applications cliente et serveur sur la meme machine donc j;'ai mis
    client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    c = new TcpClient("localhost", 1069);
    serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     IPHostEntry iphe = Dns.Resolve("localhost");
    maintenant je souhaiterais que le client soit un PDA donc j'ai refait le meme code mais lors de l'exécution je l'ai fait déployé avec l'outil de visual studio, la connexion ne se passe pas entre le client et le sreveur ?? donc est ce que je devrait changer le localhost par des adresses IP ou quoi ? je pense que le PDA virtuel n'est pas considéré comme machine locale !!

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Par défaut
    Effectivement, après quelques recherches, l'émulateur possède sa propre adresse physique. Une solution serait d'utiliser les adresses IP directement.
    Ou alors, si tu comprend l'anglais, j'ai trouvé cet article qui explique comment utiliser fiddler pour mettre un proxy (pour rediriger le localhost de l'émulateur sur celui de la machine).

  14. #14
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    et si je voulais utiliser les adresses IP je ferais comment pour récupérer l'adresse IP du PDA virtuel ?

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Par défaut
    Après de vaines recherches, je n'ai pas trouvé l'adresse IP de l'émulateur (à part le fameux 127.0.0.1...), ni même réussi à résoudre le dns de ma machine à partir de l'émulateur.
    Par contre, en utilisant l'adresse ip de la machine, je peux ouvrir une connexion depuis l'émulateur vers ma machine.

  16. #16
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    Bonjour !

    j'ai pas tres bien compris ce que tu veux dire par
    par contre, en utilisant l'adresse ip de la machine, je peux ouvrir une connexion depuis l'émulateur vers ma machine.
    mais si c'est pour me dire que t'as utiliser l'adresse IP de ta machine dans le client et le serveur c'est a dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    IPHostEntry iphe = Dns.Resolve("192.168.2.109");  //par exemple
     
    // et le client (le PDA)
     
    c = new TcpClient("192.168.2.109", 1069);
    ben je l'ai essayé et ca n'a pas marché dans le PDA il m'affiche cette erreur :
    Une erreur inattendu s'est produite dans PDAclient.exe
    sélectionnez Quitter puis redémarrez le programme, ou sélectionnez détails pour plus d'informations.
    Une opération de socket a été tentée sur un hôte impossible a atteindre.
    voila, merci encore pour ton aide j'apprécie beaucoup merci encore une fois.

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Par défaut
    mais si c'est pour me dire que t'as utiliser l'adresse IP de ta machine dans le client et le serveur
    C'est tout à fait ça, sauf que pour le serveur j'ai utiliser mon serveur web local.
    De plus, je suis plus habitué à utiliser les sockets que le tcp listener.

    Voila le code que j'ai utilisé pour mes tests :
    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
     
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                var entry = System.Net.Dns.GetHostEntry("192.168.0.116");
                if (entry == null || entry.AddressList.Length == 0)
                    label1.Text = "operation impossible";
                else
                {
                    foreach (var addresse in entry.AddressList)
                    {
                        label1.Text += string.Format("{0}\r\n", addresse.ToString());
                    }
     
                    var t = new System.Net.Sockets.Socket(entry.AddressList[0].AddressFamily, System.Net.Sockets.SocketType.Raw, System.Net.Sockets.ProtocolType.IP);
                    t.Connect(new System.Net.IPEndPoint(entry.AddressList[0], 80));
                    if (!t.Connected)
                        label1.Text += "\nechec de la connexion";
                    else
                    {
                        label1.Text += "\nsucces de la connexion\n";
                    }
     
                }
            }
        }
    Sinon, une question toute bête, tu avais lancé ton serveur avant le client ?

  18. #18
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut


    mais non quand même j'ai exécuté le serveur d'abord en suite le client, mais c'est bizarre ! comment ca se fait qu'avec le TCP listener ca ne marche pas ??!

    pour le serveur web je n'ai aucune idée la dessus

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Par défaut
    En effet, dans l'état de base de l'émulateur, pas moyen d'ouvrir une vrai socket tcp/ip (désolé pour les espoirs, mais si je fait de la mer**, je vais pas t'aider...).
    Pour la petite explication, quand on ouvre une socket en RAW, on n'utilise aucun support des couches réseaux en dessous et par conséquent il faut créer soit même ses paquets (si j'ai bien tout saisi).
    J'ai vu que l'on peut configurer les connections réseaux dans l'émulateur grâce au menu (Fichier -> configurer -> reseaux), mais il faut alors installer virtual pc 2007, et comme je suis au boulot, jene peux pas le faire.
    Désolé de ne pas pouvoir faire mieux.

  20. #20
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    mais au contraire je te remercier pour tout l'aide que t'as pu m'apporter !!
    Pour configurer les connections réseaux dans l'émulateur ben j'ai essayer de modifier les adresses IP sur l'emulateur,

    Dans le menu Démarrer de l'émulateur Pocket PC, clique sur Paramètres, Connexions, Cartes réseau, puis clique sur l'adaptateur approprié (par exemple, Pilote Ethernet compatible NE2000) "MSDN".

    ben j'ai changer l'adresse IP mais apparemment c'est pareil !! ca commence vraiment a m'énerver !

    juste une question, je commence a devenir bête je crois, vu que je ne vois pas le problème, dis moi stp, au niveau du serveur on doit préciser l'adresse IP du client ou celle du serveur ? et de même pour le client dans le TcpClient on doit préciser l'adresse IP du serveur ou celle du client ? désolé je commence a avoir des doutes partout !!!!

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/05/2014, 08h03
  2. Améliorer un code client/Serveur avec boost.
    Par Invité dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 29/07/2013, 14h31
  3. Code Client/serveur avec thread sur Android
    Par Narcistou dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 21/04/2011, 12h25
  4. Réponses: 8
    Dernier message: 23/11/2007, 23h59
  5. code source application client serveur
    Par adel84 dans le forum Delphi
    Réponses: 1
    Dernier message: 11/12/2006, 13h01

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