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

Dotnet Discussion :

[C# , .NET ]


Sujet :

Dotnet

  1. #1
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut [C# , .NET ]
    bonjour , je suis entrain de faire une application client/server avec des socket en asynchrone . je pense que tous est parfait sauf un petit probleme lorsque la connection veut se faire :

    voila ce que le client me dit :
    Une exception non gérée du type 'System.InvalidOperationException' s'est produite dans System.Windows.Forms.dll

    Informations supplémentaires*: Opération inter-threads non valide*: le contrôle 'affichageClient' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.

    et voila ce que me dit le server :
    Une exception non gérée du type 'System.InvalidOperationException' s'est produite dans System.dll

    Informations supplémentaires*: Opération inter-threads non valide*: le contrôle 'affichage' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
    j'ai souligne la partie du code qui pose probleme dans le client en rouge :


    voila le code 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
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    namespace Client
    {
        class client
        {
            
            private ListBox affichageClient;
            private Socket socketClient;
            private byte[] bufferEcriture = new byte[400];
            private byte[] bufferLecture  = new byte[400];
    
    
            public client(ListBox lbc)
            {
                affichageClient = lbc;
            }
            public void seConnecterAuServeur()
            {
                socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socketClient.BeginConnect(new IPEndPoint(IPAddress.Parse("192.168.1.10"), 123), new AsyncCallback(connectCallback), socketClient);
            }
            private void connectCallback(IAsyncResult ar)
            {
                try
                {
                    Socket socket = (Socket)ar.AsyncState;
                    socketClient = socket;
                    socket.EndConnect(ar);
                    affichageClient.Items.Add("Connecte au serveur");  // erreur ici 
    
                    socketClient.BeginReceive(bufferLecture, 0, bufferLecture.Length, SocketFlags.None,
                        new AsyncCallback(ReceiveCallback), socketClient);
                }
                catch (SocketException ex)
                {
                    affichageClient.Items.Add(ex.Message);
                }
    
            }
            private void ReceiveCallback(IAsyncResult ar)
            {
                try
                {
                    Socket socket = (Socket)ar.AsyncState;
                    int read = socket.EndReceive(ar);
    
                    if (read > 0)
                    {
                        affichageClient.Items.Add("Le serveur Dit : " + Encoding.ASCII.GetString(bufferLecture));
                        Buffer.SetByte(bufferLecture, 0, 0);
                        socketClient.BeginReceive(bufferLecture, 0, bufferLecture.Length, SocketFlags.None,
                        new AsyncCallback(ReceiveCallback), socketClient);
                    }
                }
                catch (SocketException ex)
                {
                    affichageClient.Items.Add(ex.Message);
                }
            }
            public void sendMessage(string Message)
            {
                bufferEcriture = Encoding.ASCII.GetBytes(Message);
                socketClient.BeginSend(bufferEcriture, 0, bufferEcriture.Length, SocketFlags.None,
                    new AsyncCallback(sendCallback), socketClient);
            }
            private void sendCallback(IAsyncResult ar)
            {
                try
                {
                    Socket socket = (Socket)ar.AsyncState;
                    int send = socket.EndSend(ar);
                    affichageClient.Items.Add("Message envoye " + send + " bytes envoyees{");
                }
                catch (SocketException ex)
                {
                    affichageClient.Items.Add(ex.Message);
                }
            }
            public void Close()
            {
                socketClient.Shutdown(SocketShutdown.Both);
                socketClient.Close();
                affichageClient.Items.Add("Connexion fermee");
            }
        }
    }



    et 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
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    namespace server
    {
        class serveur
        {
     
            private Socket server;
            private Socket client;
            private ListBox affichageServeur;
            private byte[] bufferLecture = new byte[400];
            private byte[] bufferEcriture= new byte[400];
     
     
            public serveur(ListBox ecranServeur)
            {
                affichageServeur = ecranServeur;
            }
            public void demmarrerLeServeur()
            {
                server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
                server.Bind(new IPEndPoint(  IPAddress.Parse("192.168.1.10"), 123));
                server.Listen(20);
                server.BeginAccept(new AsyncCallback(acceptCallback), server);
            }
            private void acceptCallback(IAsyncResult ar)
            {
                try
                {
                    Socket unClient = (Socket)ar.AsyncState;
                    client = unClient;
                    unClient.BeginReceive(bufferLecture, 0, bufferLecture.Length, SocketFlags.None, new AsyncCallback(ReceiveMessageCallback), unClient);
                }
                catch (SocketException ex)
                {
                    affichageServeur.Items.Add(ex.Message);                              
                }
            }
            private void ReceiveMessageCallback(IAsyncResult ar)
            {
                Socket leClient = (Socket)ar.AsyncState;
                client = leClient;
                int read = leClient.EndReceive(ar);
                if (read > 0)
                {
                    affichageServeur.Items.Add("Client dit : " + Encoding.ASCII.GetString(bufferLecture));
                    Buffer.SetByte(bufferLecture, 0, 0);
                    client.BeginSend(bufferEcriture, 0, bufferEcriture.Length, SocketFlags.None, new AsyncCallback(SendCallback), client);
                    client.BeginReceive(bufferLecture, 0, bufferLecture.Length, SocketFlags.None, new AsyncCallback(ReceiveMessageCallback), client);
     
                }
            }
            public void Send(string message)
            {
     
                client.BeginSend(bufferEcriture, 0, bufferEcriture.Length, SocketFlags.None, new AsyncCallback(SendCallback), client);
     
            }
            private void SendCallback(IAsyncResult ar)
            {
                try
                {
                    Socket socket = (Socket) ar.AsyncState;
                    int send = socket.EndSend(ar);
                    affichageServeur.Items.Add("Message Envoye " + send);
                }
                catch( SocketException ex)
                {
                    affichageServeur.Items.Add(ex.Message);
                }
            }
     
            public void CloseClient()
            {
                client.Close();
                affichageServeur.Items.Add("Client arrete");
            }
            public void CloseServer()
            {
                CloseClient();
                server.Close();
                affichageServeur.Items.Add("Le serveur a ete arrete");
            }
        }
    }
    apparement c'est un probleme tres courant dans le reseau en mode asynchrone et la j'aimerais trouver le moyen de pas avoir de conflits entre les threads , j'ai entendu parler des delegues mais comment ?

    Merci pour votre futur aide qui me sera tres tres precieuse et je vous souhaite une bonne soiree.

  2. #2
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    En effet il n'est pas possible de modifier l'interface graphique à partir d'un autre thread que celui de la fenêtre. Il existe un composant BackgroundWorker qui permet de résoudre ton problème.

  3. #3
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut
    merci d'avoir repondu , mais cette classe me parait comme une usine a gaz , tres radicale a utiliser en dernier recours .
    y'aurais pas un moyen plus simple ?

  4. #4
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    Essayes de te renseigner sur la méthode Invoke ou BeginInvoke et EndInvoke du ListBox.

  5. #5
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 259
    Par défaut
    Les 2 erreurs n'ont rien à voir l'une avec l'autre mais se sont 2 erreurs identiques, 2x la même erreur en fait.

    Il faut passer par les delegate pour pouvoir communiquer entre les threads

    Cherche les infos sur l'utilisation des méthodes delegate, et sur la communication inter-threads.

    Tiens, regarde cette page sur MSDN : http://msdn.microsoft.com/fr-fr/library/ms171728.aspx

  6. #6
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Essayes de te renseigner sur la méthode Invoke ou BeginInvoke et EndInvoke du ListBox
    +1 : BeginInvoke().

  7. #7
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut
    merci beaucoup , beaucoup , probleme regle , avec beginInvoke sa marche super bien , utilisant les delegues . merci beaucoup

  8. #8
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    de rien

  9. #9
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 3
    Par défaut socket server/client - Forms - threads
    Bonjour

    tu dis que le beginInvoke t'a résolu ton pb
    est ce que tu peux donner la solution avec du code
    parce que tous les codes sources avec les sockets et les forms
    donnent TOUS la même erreur
    c'est à se poser la question si
    les codes sources ont été testés !!!

    merci une autre fois pour donner le code qui t'a aider à résoudre le pb.

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

Discussions similaires

  1. [Débat] Technologie .NET vs JAVA
    Par neo.51 dans le forum Débats sur le développement - Le Best Of
    Réponses: 1048
    Dernier message: 14/01/2026, 21h18
  2. [Débat] Expériences au sujet de .NET
    Par DevX dans le forum Débats sur le développement - Le Best Of
    Réponses: 46
    Dernier message: 25/05/2014, 12h16
  3. A ceux qui ont migré de VB6 vers VB.Net
    Par Fox dans le forum VB 6 et antérieur
    Réponses: 81
    Dernier message: 21/05/2008, 15h56
  4. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 16h57
  5. Fichier PDOXUSRS.NET
    Par yannick dans le forum Paradox
    Réponses: 5
    Dernier message: 05/04/2002, 10h45

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