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 :

Socket envoi message Client/Serveur


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut Socket envoi message Client/Serveur
    Bonjour;

    Je suis en train de développer une appli client/serveur de messagerie instantannée Like MSN. J'ai consulter énormément de topic, tuto et cours mais je suis sur une erreur et aussi quelques interrogations.
    En effet j'ai trouvé beaucoup d'exemple concernant des applications où le serveur "se contenter" de mettre en relation plusieurs client mais dans le cas d'une application de messagerie instantannée l'application est à la fois cliente et serveur car chaque client doit pouvoir envoyer et recevoir des messages.

    J'utilise donc les sockets en mode asynchrone et le démarrage du serveur se passe bien :


    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
     
    //Création de la socket 
                this.ServerSocket = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream,
                ProtocolType.Tcp);
                try
                {
                    //On lie la socket au point de communication 
                    ServerSocket.Bind(new IPEndPoint(ipAddress, 8000));
     
                    //On la positionne en mode "écoute" 10 Clients Max 
                    ServerSocket.Listen(10);
     
                    //On se met en attente de la connection d'un client  
                    ServerSocket.BeginAccept(new AsyncCallback(ConnectionAcceptCallback), ServerSocket);
                    MessageBox.Show("Serveur démarré en : "+ipAddress);


    Ensuite un client se connecte au serveur (typiquement en double clic sur un contact de sa liste) ou en rentrant l'ip a contacter (le port n'étant pas configurable mais c'est un détail pour l'instant)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    this.SocketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     
                    IPAddress ipadress;
                    //On récupere l'adresse ip a contacter 
                    ipadress = IPAddress.Parse(ip_destinataire.Text);
     
                    this.SocketClient.BeginConnect(new IPEndPoint(ipadress, 8000), new AsyncCallback(ConnectCallback), this.SocketClient);

    Venant en au problème l'envoi d'un message du client au serveur et inversement.
    Une fois que le client est connecté j'ouvre un Nouvelle Form "Message" qui sert a saisir le message à envoyer.
    Mais le serveur n'est pas encore en attente de message et je ne sais pas quand le faire pour moi le plus simple étant de mettre le serveur en attente dès que le client ce sera connecté au serveur (même s'il peut se connecter et rien écrire finalement).


    J'ai donc une fonction ReceiveMessage()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public void ReceiveMessage()
            {
                if (this.SocketClient != null && this.SocketClient.Connected)
                {
                    //On se met en attente d'un message 
                    this.SocketClient.BeginReceive(this.readbuf, 0, this.readbuf.Length, SocketFlags.None, new AsyncCallback(ReceiveMessageCallback), this.SocketClient);
                }
                else
                {
                    MessageBox.Show("Client non connecté" );
                }
            }


    Qui est appelé lorsqu'un client vient de se connecter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //on accepte la connection 
                        this.SocketClient = socket.EndAccept(asyncResult);
                        MessageBox.Show("Connexion acceptee" );
     
                        ReceiveMessage();
                    }



    et j'ai l'erreur suivante :


    Voilà je sais que c'est un peu long mais j'essaye d'être précis et c'est pas facile d'expliquer un projet en cours de réalisation.
    N'hésitez pas de faire des suggestions elles seront bienvenu...

    Merçi

  2. #2
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    la seule variable qui peut etre null est readbuf; essaye d'ajouter un new.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void ReceiveMessage()
    {
      if (this.SocketClient != null && this.SocketClient.Connected)
      {
         readbuf = new byte[1024];//*par Exemple
         //etc...
    S'il n'y a pas de Solution, c'est qu'il n'y a pas de Problème.
    ----------------------------------------------------------------------------------------
    Pour se protéger, un bon préservatif pour votre PC : AntiVir et SpyBot - Search & Destroy

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Une seule chose a dire Halucinant en un coup d'oeuil merçi beaucoup c'été ça...

    Mais j'ai une boucle infini :
    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
    private void ReceiveMessageCallback(IAsyncResult asyncResult)
            {
                string[] displaydata;
                try
                {
                    //On récupère le socket de la connection
                    Socket socket = (Socket)asyncResult.AsyncState;
                    //On lis les byte qui sont envoyé par le client
                    int read = socket.EndReceive(asyncResult);
    
                    // On a reçu des données
                    if (read > 0)
                    {
                        //on appel le délégué qui s'occupe d'ajouter le message à la listbox le tout dans le bon thread
                        displaydata = new string[] { "Client dit : " + Encoding.ASCII.GetString(this.readbuf) };
    
                       //le message est écrit dans mon msgbox
                       MessageBox.Show(Encoding.ASCII.GetString(this.readbuf));
    
                        message = new Message(this);
                        message.Show();
    
                        message.ajout_message(Encoding.ASCII.GetString(this.readbuf));
                        // reset du buffer
                        Buffer.SetByte(this.readbuf, 0, 0);
                        //On se remet en attente d'un message
                        this.SocketClient.BeginReceive(this.readbuf, 0, this.readbuf.Length, SocketFlags.None, new AsyncCallback(ReceiveMessageCallback), this.SocketClient);
                    }
                    // Fermeture socket distante. On ferme la socket cliente locale
                    if (read == 0 && !this.LocalsocketClientIsShutingDown)
                    {
                        socket.Close();
                        displaydata = new string[] { "Socket distante fermée." };
                        message.ajout_message("Socket Distante fermée");
                        //On se remet en attente de la connection d'un client 
                        this.ServerSocket.BeginAccept(new AsyncCallback(ConnectionAcceptCallback), this.ServerSocket);
                    }
                }
                catch (SocketException ex)
                {
                    displaydata = new string[] { ex.Message };
                    message.ajout_message(ex.Message);
                }
            }
    ma fenetre qui est censé écrire le message boucle apparement par contre juste avant je récupère bien le message dans la Message.box

    en tout cas merçi beaucoup pour ce 1er coup de main !

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    à quel niveau??

    toute la fonction??

    Et puis un truc : Buffer.SetByte(this.readbuf, 0, 0); ne reset pas le buffer;
    Buffer.SetByte(this.readbuf, 0, 0); <=> readbuf[0]=0;

    Peut etre un autre new résoudrai l'affaire
    Remplace : Buffer.SetByte(this.readbuf, 0, 0);
    Par : readbuf = new byte[1024];

    peut etre
    S'il n'y a pas de Solution, c'est qu'il n'y a pas de Problème.
    ----------------------------------------------------------------------------------------
    Pour se protéger, un bon préservatif pour votre PC : AntiVir et SpyBot - Search & Destroy

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    non en fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    message = new Message(this);
    message.Show();
    donc la fenêtre s'affiche mais reste toute blanche (comme quand ça répond pas et que ça boucle)

    après il va bien dans la fonction appelé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    message.ajout_message(Encoding.ASCII.GetString(this.readbuf));
    qui fait juste un ajout dans la textbox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            public void ajout_message(String message) 
            {
                message_texte.Text = message_texte.Text + "Le message envoyé est :" +message;
            }
    ensuite il sort de la fonction après qu'il se soit remis en attente de reception de message.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.SocketClient.BeginReceive(this.readbuf, 0, this.readbuf.Length, SocketFlags.None, new AsyncCallback(ReceiveMessageCallback), this.SocketClient);
    et la fenêtre reste inactive

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    t'a changer la ligne de Reset du Buffer?
    S'il n'y a pas de Solution, c'est qu'il n'y a pas de Problème.
    ----------------------------------------------------------------------------------------
    Pour se protéger, un bon préservatif pour votre PC : AntiVir et SpyBot - Search & Destroy

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Oui j'ai modifier ça fait toujours pareil
    et même si je met completement en commentaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.SocketClient.BeginReceive(this.readbuf, 0, this.readbuf.Length, SocketFlags.None, new AsyncCallback(ReceiveMessageCallback), this.SocketClient);
    ça fait pareil

    comme si c'été à partir de l'ouverture de la fenêtre que ça planté

  8. #8
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    Fait voir le constructeur et la fonction load de ta Fenetre Message
    S'il n'y a pas de Solution, c'est qu'il n'y a pas de Problème.
    ----------------------------------------------------------------------------------------
    Pour se protéger, un bon préservatif pour votre PC : AntiVir et SpyBot - Search & Destroy

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            public Message(Authentification auth)
            {
                InitializeComponent();
                this.auth = auth;
            }
     
            private void Message_Load(object sender, EventArgs e)
            {
     
            }

  10. #10
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    Là, je block

    Désolé, Bon courage
    S'il n'y a pas de Solution, c'est qu'il n'y a pas de Problème.
    ----------------------------------------------------------------------------------------
    Pour se protéger, un bon préservatif pour votre PC : AntiVir et SpyBot - Search & Destroy

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Ben merçi quand même super sympas d'avoir passé du temps

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    en faisant un ShowDialog ça marche....

  13. #13
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    Si c'est bon, n'oubli pas le tag
    S'il n'y a pas de Solution, c'est qu'il n'y a pas de Problème.
    ----------------------------------------------------------------------------------------
    Pour se protéger, un bon préservatif pour votre PC : AntiVir et SpyBot - Search & Destroy

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    en fait en faisant un showdialog() a la fermeture j'ai cette erreur :



    en faisant un Show() la fenêtre restante bloquante ne répond pas

    j'ai essayé de faire un délégué mais ça fait toujours pareil

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                        //on les ajoute a la fenetre message et on l'ouvre
                        message = new Message(this);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                        //on appele le delegue pour ouvrir la fenetre
                        mondelegue delegue = new mondelegue(message.Show);
                        delegue.Invoke();
    Par contre le new Message() n'est pas dans une délégué j'arrive pas à faire un délégué qui fait le new...

  15. #15
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    essaye ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                catch (SocketException ex)
                {
                    displaydata = new string[] { ex.Message };
                    message.ajout_message(ex.Message);
                }
                catch (Exception ex1) //Enfin, essaye ^^
                { }
            }
    S'il n'y a pas de Solution, c'est qu'il n'y a pas de Problème.
    ----------------------------------------------------------------------------------------
    Pour se protéger, un bon préservatif pour votre PC : AntiVir et SpyBot - Search & Destroy

  16. #16
    Membre habitué Avatar de Couz02
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 232
    Points : 182
    Points
    182
    Par défaut
    Une simple question : ton application marche t-elle en dehors d'un réseau local ? Si oui ça m'interesse
    N'oubliez pas que
    Msdn

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Honnêtement j'ai pas testé ton code
    j'ai fait un thread qui ouvre ma fenêtre du coup ce n'est pas bloquant.
    je donne le code ça peut servir

    Classe Mythread :

    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
     
    public class MyThread
        {
     
            public Message form_message ;
     
            public MyThread(Message form_message) 
            {
                this.form_message = form_message;
            }
     
            public void run()
            {
                //show your form in a new thread by overriding the run method of Thread
                form_message.ShowDialog();
            }
     
        }
    Là ou je veux ouvrir ma fenêtre :

    Déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            //Thread pour l'ouverture de la fenetre message
            Thread monthread;
            MyThread mythread;
    Appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                        message = new Message(this);
                        mythread = new MyThread(message);
                        monthread = new Thread(new ThreadStart(mythread.run));
                        monthread.Start();

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Couz02 Voir le message
    Une simple question : ton application marche t-elle en dehors d'un réseau local ? Si oui ça m'interesse
    Désolé c'est un projet en cours de réalisation mais ça sera la cerise sur le gateau de le faire marcher par internet

  19. #19
    Membre habitué Avatar de Couz02
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 232
    Points : 182
    Points
    182
    Par défaut
    Désolé c'est un projet en cours de réalisation mais ça sera la cerise sur le gateau de le faire marcher par internet
    Ben écoute, si tu est en TCP/IP, moi j'ai pas réussi à le faire marcher en dehors d'un réseau local à moins de rediriger ton firewall vers la machine cible :
    Sinon j'ai penser de passer par le système de MSN qui lui marche par internet. Je suis en train de tester.
    Protocol MSNP10 je crois qui est intéressant
    N'oubliez pas que
    Msdn

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    c'est à dire de passer par le système de MSN ?


    EDIT : Excuse j'avais pa vu le protocole utilisé

Discussions similaires

  1. Problème Socket Java architecture Client Serveur
    Par Jonny-1600 dans le forum Langage
    Réponses: 4
    Dernier message: 30/11/2012, 20h50
  2. Mes premiers sockets : problème échange client serveur
    Par odsen.s dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 16/05/2010, 18h32
  3. Réponses: 3
    Dernier message: 02/03/2009, 22h34
  4. message client serveur
    Par ac/dc dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/10/2006, 17h01
  5. probleme avec applet envoie message au serveur
    Par Battosaiii dans le forum Applets
    Réponses: 1
    Dernier message: 10/12/2005, 20h51

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