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 :
- //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 :
- 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 :
- 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 :
- //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çii