Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1438 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#][Socket] Connexion asynchrone

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C#][Socket] Connexion asynchrone

n°745330
Remigio
Radio Flip, 72.8
Posté le 30-05-2004 à 17:08:22  profilanswer
 

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 :  
 

Code :
  1. private static ManualResetEvent connectDone = new ManualResetEvent(false);
  2. private void cmdaConnexion_Click(object sender, System.EventArgs e)
  3. {
  4.    System.Net.IPAddress AdresseIP = System.Net.IPAddress.Parse("192.168.0.1" );
  5.    System.Net.IPEndPoint Serveur = new IPEndPoint (AdresseIP,8221);
  6.    socWorker=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
  7.    socWorker.BeginConnect(Serveur, new AsyncCallback(ConnectCallback), socWorker);
  8. connectDone.WaitOne();
  9. }


 
avec la procédure  
 

Code :
  1. private static void ConnectCallback(IAsyncResult ar)
  2. {
  3.    Socket socWorker = (Socket) ar.AsyncState;
  4.    client.EndConnect(ar);
  5.    connectDone.Set();
  6. }


 
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
mood
Publicité
Posté le 30-05-2004 à 17:08:22  profilanswer
 

n°746100
jaylee
Posté le 31-05-2004 à 13:37:46  profilanswer
 

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 :
  1. private delegate void ConnectDoneHandler(string message);
  2.  Socket _socket = null;
  3.  private void cmdaConnexion_Click(object sender, System.EventArgs e) 
  4.  { 
  5.   IPAddress address = IPAddress.Parse("192.168.0.1" ); 
  6.   IPEndPoint server = new IPEndPoint(address, 8221);
  7.   _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
  8.   _socket.BeginConnect(Serveur, new AsyncCallback(ConnectCallback), socWorker); 
  9.  }
  10.  private void ConnectCallback(IAsyncResult result)
  11.  {
  12.   try {
  13.    _socket.EndAccept(result);
  14.    // Do some read operations, asynchronously
  15.    // _socket.BeginReceive(...);
  16.    // Mandatory for GUI update operations
  17.    BeginInvoke(new ConnectDoneHandler(OnConnectDone),
  18.     new object[]{ "Connection established..." });       
  19.   }
  20.   catch(Exception e) {
  21.    Console.WriteLine(e);
  22.   }
  23.  }
  24.  private void OnConnectDone(string message)
  25.  {
  26.   myLabel.Text = message;
  27.  }


 
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 :
  1. public class MyNetworkManager
  2. {
  3.  public event EventHandler Connected;
  4.  public event EventHandler ConnectionFailed;
  5.  private Socket  _socket;
  6.  private IPEndPoint _serverEndPoint;
  7.  public MyNetworkManager(IPAddress address, int port)
  8.  {
  9.   _serverEndPoint = new IPEndPoint(address, port);
  10.  }
  11.  public void Connect()
  12.  {
  13.   _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
  14.   _socket.BeginConnect(_serverEndPoint, new AsyncCallback(ConnectDone), null);
  15.  }
  16.  private void ConnectDone(IAsyncResult result)
  17.  {
  18.   try
  19.   {
  20.    _socket.EndConnect(result);
  21.    OnConnectDone();
  22.    // Start async reading...
  23.   }
  24.   catch(Exception /* e */)
  25.   {
  26.    OnConnectionFailed();
  27.   }
  28.  }
  29.  private void OnConnectDone()
  30.  {
  31.   if(Connected != null)
  32.    Connected(this, new EventArgs());
  33.  }
  34.  private void OnConnectionFailed()
  35.  {
  36.   if(ConnectionFailed != null)
  37.    ConnectionFailed(this, new EventArgs());
  38.  }
  39. }


 
Tu pourras utiliser l'objet de cette manière :
 

Code :
  1. MyNetworkManager manager = new MyNetworkManager(IPAddress.Parse("192.168.0.1" ), 1234);
  2. // Hook some events
  3. manager.Connected += new EventHandler(OnManagerConnected);
  4. manager.ConnectionFailed += new EventHandler(OnManagerConnectionFailed);
  5. // Then begin the connection
  6. manager.Connect();


 
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


Message édité par jaylee le 31-05-2004 à 14:03:00
n°749787
Remigio
Radio Flip, 72.8
Posté le 03-06-2004 à 00:12:55  profilanswer
 

merci pour toutes ces info ca m'aide bcp :)


---------------
Everybody can succeed, all you need is to believe
n°750455
meumeul
Stay Heavy
Posté le 03-06-2004 à 12:09:30  profilanswer
 

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 :D
 
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...


Message édité par meumeul le 03-06-2004 à 13:59:40
n°752479
meumeul
Stay Heavy
Posté le 04-06-2004 à 13:51:22  profilanswer
 

up plz

n°752742
jaylee
Posté le 04-06-2004 à 15:53:51  profilanswer
 


 
Peut-être qu'en posant ta question proprement, il serait possible de te répondre...
 
--
Jay
{Epitech.}
http://www.labtech.epitech.net/blogs


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#][Socket] Connexion asynchrone

 

Sujets relatifs
[J2ME] Erreur de connexion à une URLConnexion JSP/MySql
[Débutant] Socket en C + interaction avec du PHPprobleme de stockage de socket
[VB6] Créer une connexion multiclient/serveurprob de transfert sur socket TCP
Socket UDP (Connexion routable)Connexion Windows RAS, SLIP ou CSLIP ?
Connexion à une BD MS SQL Serveur 
Plus de sujets relatifs à : [C#][Socket] Connexion asynchrone


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR