Evènement distant en réseau

kikiokiller Messages postés 42 Date d'inscription lundi 26 février 2007 Statut Membre Dernière intervention 31 mai 2009 - 23 mai 2009 à 12:58
kikiokiller Messages postés 42 Date d'inscription lundi 26 février 2007 Statut Membre Dernière intervention 31 mai 2009 - 25 mai 2009 à 16:11
Bonjour à tous,


Dans le cadre d'une application client serveur que j'essaie de réaliser
depuis 3 semaines maintenant, je rencontre un problème concernant des
évènements distant.


Oublions la notion de client/serveur un instant, mais parlons plutôt
d'une application installé sur un ordinateur A et d'une autre
application installé sur un ordinateur B. Toutes deux étant bien
différente, mais communicante en réseau local.


J'ai donc pu obtenir un exemple sur internet:
http://www.geekpedia.com/tutorial236...in-Csharp.html


Pour ceux qui prendront la peine de télécharger ces deux applications,
vous constaterez que se sont deux applications communiquant en réseau
tcp, et que lorsque l'application "client" se connecte à l'application
"serveur", un evenement "monitor" se déclenche coté serveur.


Il apparait donc évident qu'il est tout à fait possible d'écrire des méthodes coté serveur, et de les faire appeler du client.

En l'occurrence ici, le serveur attend une connexion pour exécuter la méthode "Monitor".


J'aimerai donc me baser sur cet exemple, en rajoutant un bouton coté client pour qu'un formulaire s'ouvre coté serveur.


Il va de soit que la méthode d'ouverture ( form.show()) est écrite coté serveur.

Comment puis-je obtenir ce résultat?


Merci infiniment pour votre aide.

6 réponses

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
25 mai 2009 à 10:29
Salut

Ton 1er programme doit envoyer un message au deuxième. Ce deuxième programme doit continuellement regarder s'il reçoit un message.
Une fois qu'il a reçu le message correspondant au clic sur le bouton du premier programme, le deuxième programme ouvre sa fenêtre.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
0
kikiokiller Messages postés 42 Date d'inscription lundi 26 février 2007 Statut Membre Dernière intervention 31 mai 2009
25 mai 2009 à 10:46
Je dois donc créer un protocole? Comment dois-je procéder? Aurais tu un exemple à me fournir sous forme de code ( coté client, coté serveur). Peut etre une dll commune aussi?
Merci
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
25 mai 2009 à 11:14
Créer un protocole : à priori oui, je ne vois pas d'autre solution.
Comment tu dois procéder : théoriquement, un simple envoi/lecture d'un string sur une socket devrait suffire (bon, personnellement, je n'ai jamais utilisé de socket en C#, donc je ne peux pas m'étendre sur le sujet, désolé).

Un exemple précis, non. Un exemple basique du fonctionnement, oui :

client :
public Form1()
{
    InitializeComponent();
    Reseau MonReseau = new Reseau(); // Classe perso qui te permet d'utiliser des sockets
    MonReseau.OuvertureSocket("192.168.0.10", 1000); // une méthode qui crée une socket et l'ouvre entre cet ordi et l'ordi dont tu fournis l'adresse IP sur le port indiqué.
    monBouton.Click += new EventHandler(monBouton_Click);
}

private void monBouton_Click(object sender, EventArgs e)
{
    MonReseau.EnvoieMessage("OUVRE_FENETRE");
}

serveur :
static void main(string[] args)
{
    string message;
    bool stop = false;
    Reseau MonReseau = new Reseau();
    MonReseau.AttendUneConnexion(1000);
    do
    {
        message = MonReseau.LitMessage();
        switch(message)
        {
            case "OUVRE_FENETRE":
                maForm = new Form1();
                maForm.Show();
                break;
            case "QUITTER":
                maForm.Close();
                stop = true;
                break;
            default:
                MessageBox.Show("Message non reconnu !");
                break;
        }
    }
    while(!stop);
}

Bon, voilà une ébauche de code qui pourrait faire ce que tu souhaites (bon, il faut quand même créer ou trouver une classe comme "Reseau" dans mon exemple). Ne connaissant pas du tout WCF, je ne peux pas te dire s'il existe plus simple pour faire ça.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
0
kikiokiller Messages postés 42 Date d'inscription lundi 26 février 2007 Statut Membre Dernière intervention 31 mai 2009
25 mai 2009 à 11:40
Je vais essayer tout ca. Peut etre que ca serait plus simple avec du .net remoting?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
25 mai 2009 à 12:07
En fait, je ne connais à peu près rien en réseau spécifique à .net (ni WCF, ni .net remoting...).
Cependant, je me demande si le .net remoting n'est pas fait pour exécuter des méthodes stockées sur une autre machine...
Le fait est que (je ne crois pas qu'il y ait d'exception) un code est TOUJOURS exécuté sur la machine APPELANTE, et non sur la machine sur laquelle le code se trouve.

donc si, sur le client, tu fais un truc du genre

monServeur.ShutdownTheComputer();
ça t'éteindra le client et non le serveur.

C'est pourquoi il faut passer un message à ton serveur pour que le serveur puisse exécuter la méthode.

Mais maintenant que j'y pense, un service web c'est juste un passage de messages en SOAP, donc théoriquement, son code est exécuté sur la machine sur laquelle le service est exécuté. Tu peux aussi voir dans cette direction...

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
0
kikiokiller Messages postés 42 Date d'inscription lundi 26 février 2007 Statut Membre Dernière intervention 31 mai 2009
25 mai 2009 à 16:11
Merci msieur :)
0
Rejoignez-nous