Connexion asynchrone [C#][Socket] - C#/.NET managed - Programmation
Marsh Posté le 31-05-2004 à 13:37:46
Dans le code que tu présentes, tu as rendu le modèle de connection asynchrone... synchrone Tout cela parceque tu utilises un ManualResetEvent pour bloquer la fonction qui rend la connection asynchrone, ce qui est complètement inutile.
Le principe du modèle asynchrone est de démarrer le traitement d'une commande (ici la connection d'un socket) dans une thread séparée. L'argument AsyncCallback que tu passes à la fonction BeginConnect sert à fournir un delegate qui sera appelé lorsque la connection sera effectuée.
Ici, tu appelles la fonction BeginConnect puis tu bloques sur un event dans un handler d'évenement WinForms, ce qui a certainement pour effet de te bloquer ton application tant que la connection n'est pas effectuée. Dans le pire des cas, tu peux ne jamais sortir de cette fonction si la connection n'est pas établie...
Tout l'intéret de l'asynchrone ici est justement de ne pas bloquer ta GUI et d'effectuer les traitement qui prennent du temps en arrière plan.
Ainsi tu feras plutôt quelque chose du style :
Code :
|
Il faut savoir également qu'intégrer des éléments réseau dans le code de la GUI est une très mauvaise pratique. Il faut créer un objet séparé et effectuer la communication grâce à des méthodes et évènements.
.NET facilite le développement de composants, il faut donc en profiter. Tu pourras donc créer un objet dans le style :
Code :
|
Tu pourras utiliser l'objet de cette manière :
Code :
|
Tu auras certainement remarqué l'utilisation de Control.BeginInvoke dans mon premier exemple : Cela permet de mettre à jour proprement l'interface graphique depuis une autre thread que la thread principale.
Tu pourras trouver des articles ici et ici traitant de ce sujet.
Le fonctionnement asynchrone est très puissant mais il amène son lot de problèmes qu'il faut gérer...
--
Jay
{Epitech.}
http://www.labtech.epitech.net/blogs
Marsh Posté le 03-06-2004 à 00:12:55
merci pour toutes ces info ca m'aide bcp
Marsh Posté le 03-06-2004 à 12:09:30
Moi j´ai réalisé un client en mode syncrone dans un thread pour pas bloquer mon ihm.
jécris au serveur, le serveur recoit parfaitement mon message.
il doit alors m´envoiyer un message de reponse (ACK, accusé de reception en gros)
Donc apres avoir ecrit mes bytes, je fais un read dans le stream de mon TcpClient.
Et la..... BLOQUAGE sur le read. si jeteinds le serveur, alors jobtiens suelemt la reponse...
Et ca avec un serveur qui n´est pas de moi.
Maintenant j´ai fait aussi mon propre serveur dans un thread,
et la aucun problème....
alors je comprends pas. Etant donné qu´avec mon serveur cela
fonctionne, je me suis dit que de tout reecrire en mode asynchrone ne sert a rien. mais je sais pas.
en fait je voudrais que le client puisse signaler au serveur que son ecriture est finie et quil va lire.
j´ai tenté un flush() du stream sans succes. C´est le dernier probleme de mon appli, il me reste deu xjours avant de la rendre...
Alors... a laide
edit: je commence a croire que c le serveur qu´est moisi...
c NeoBrowser. kkun connait ? parce que la jai des doutes sur
ses capacités...
Marsh Posté le 04-06-2004 à 15:53:51
meumeul a écrit : up plz |
Peut-être qu'en posant ta question proprement, il serait possible de te répondre...
--
Jay
{Epitech.}
http://www.labtech.epitech.net/blogs
Marsh Posté le 30-05-2004 à 17:08:22
Bonjour,
je désire créer deux appliactions toutes betes (pour apprendre a me servir des sockets). Une serveur et une cliente.
le but est que le client se connecte au serveur et une fois connecter, on peut lui envoyer une chaine, le serveur la recoit et la renvoit au client. Rien de bien méchant.
J'y arrive parfaitement en mode synchrone.
En revanche, en ce qui concerne le mode asynchrone, j'éprouve qques difficultés de compréhension. (Je me guide via un tuto trouvé sur le net http://www.labo-dotnet.com/labo-do [...] ocket.pdf)
Je parle uniquement de la connexion du client au serveur :
avec la procédure
lors du socWorker.BeginConnect, je n'arrive pas a comprendre le sens de l'arguement new AsyncCallback(ConnectCallback), a quoi sert il ?...
je ne comprend pas bien car comme argument, il appelle la procédure ConnectCallback qui elle meme prend comme argument ar alors que je ne l'ai spécifié nulpart...
Bref, si qqun pouvait m'expliquer simplement le principe de fonctionnement de la connexion asynchrone je vous en serais tres reconnaissant car j'ai un peu de mal j'avoue.
Et si aussi vous avez des tutos je suis preneur
merci d'avance
---------------
Everybody can succeed, all you need is to believe