Dans une application Client/serveur de messagerie instantannée j'ai les fonctions suivantes permettant la réception d'un message envoyé.
Code :
publicvoid ReceiveMessage(){if(this.SocketClient != null && this.SocketClient.Connected){//On se met en attente d'un message
readbuf = newbyte[1024];//par Exemplethis.SocketClient.BeginReceive(this.readbuf, 0, this.readbuf.Length, SocketFlags.None, new AsyncCallback(ReceiveMessageCallback), this.SocketClient);
}else{
MessageBox.Show("Client non connecté");
}}
privatevoid 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 clientint read = socket.EndReceive(asyncResult);
// On a reçu des donnéesif(read > 0){//on affiche le message dans un MessageBox
MessageBox.Show(Encoding.ASCII.GetString(this.readbuf));
//on les ajoute a la fenetre message et on l'ouvre
message = new Message(this);
message.ajout_message(Encoding.ASCII.GetString(this.readbuf));
message.ShowDialog();
// reset du buffer//Buffer.SetByte(this.readbuf, 0, 0);
readbuf = newbyte[1024];
//On se remet en attente d'un messagethis.SocketClient.BeginReceive(this.readbuf, 0, this.readbuf.Length, SocketFlags.None, new AsyncCallback(ReceiveMessageCallback), this.SocketClient);
message.ShowDialog();
}// Fermeture socket distante. On ferme la socket cliente localeif(read == 0 && !this.LocalsocketClientIsShutingDown){
socket.Close();
displaydata = newstring[]{"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){
MessageBox.Show(ex.Message);
}catch(InvalidOperationException io){
MessageBox.Show(io.Message);
}}
La réception du message se fait correctement mais lorsque je ferme la fenêtre de Message, elle apparaît une seconde fois à l'identique, et lorsque je la ferme une deuxième fois j'ai cette erreur :
Or le
<!-- BEGIN TEMPLATE: bbcode_code -->
Code :
catch(InvalidOperationException io)
<!-- END TEMPLATE: bbcode_code -->à bien été fait, je ne comprend pas pourquoi j'ai cette erreur.
Merçi ...<!-- / message -->
Euh c'est peut etre une question bete, mais un "try" ne doit pas etre associé qu'à un seul "catch" ?
Et sinon pourquoi ne pas fqire directement :
catch (
Exception ex){
MessageBox.Show(ex.Message);}
On peut écrire francais sur un clavier allemand , c'est juste plus long !!!
apres un try, tu peux faire autant de catch que tu veux, sachant qu'on passe dans les catch par ordre séquentiel, donc il faut respecter la hiérarchie des exceptions. donjc si tu fais
tu auras bien 2 traitements différents, alors que si tu fais
catch (Exception e)
{
}
catch(ThreadAbordException e)
{
}
tu ne passera que dans le premier catch (ThreadAbordException dérivant de exception)
l'intéret est d'avoir plusieurs traitements différents selon le type d'exception. typiquement, pour l'exemple ci dessus, tu le fera souvent dans un thread qui doit pouvoir etre interrompu pendant un traitement susceptible de lever des exceptions, et dans le catch threadabortexception tu fera un throw, tandis que tu traitera autrement lexception dans tous les autres cas.