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
Partager