IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Passage d'une interface RMI en paramètre


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 92
    Par défaut Passage d'une interface RMI en paramètre
    Bonsoir à tous,

    Je suis entrain de travailler sur un projet, et j'aimerais savoir comment passer une interface en paramètre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public interface Groupe extends Remote{
    	public void diffuser(String message) throws RemoteException;
    	public void enregistrer(Client client) throws RemoteException;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface Client extends Remote{
    	public void recvMessage(String msg) throws RemoteException;
    }
    Un serveur met en RMI registry une interface Groupe qui permet aux clients de s'enregistrer sur le serveur et de diffuser des messages aux autres membres. Les clients sont enregistrés dans un ArrayList<Client> sur le serveur.

    Quand un client envoie un message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void diffuser(String msg){
    	for(Client client : clients){
    		client.recvMessage(msg);
    	}
    }
    Le problème est que je ne sais pas comment passer une interface Client au serveur lors de l'enregistrement. Si j'exporte l'interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Client client = new ClientImpl();
    Client stub = (Client)UnicastRemoteException.exporteObject(client, 0);
    ...
    group.enregistrer(stub);
    Le client reste bloqué jusqu'à ce qu'il est unexport. Sinon je ne passe que l'interface au serveur sans l'exporter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Client client = new ClientImpl();
    group.enregistrer(client);
    Il faut que l'implémentation de l'interface Client soit Sérialisable, et il passe entièrement l'objet au serveur, les message reçus sont affiché chez serveur.

    Donc j'aimerais savoir s'il y a moyen d'enregistrer le client sur le serveur sans bloquer le thread du client et de retourner le message correctement vers le client?

    Merci d'avance !

  2. #2
    Membre très actif Avatar de _Xavier_
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2009
    Messages : 311
    Par défaut
    Pour créer des composants RMI il faut :
    1. Définir l'interface de l'objet serveur
    2. Ecrire la classe d'implémentation du seveur
    3. Ecrire le client
    4. Générer les stubs et skeletons.

    J'imagine que c'est déjà fait. Je suis un peu étranger à ta méthode d'invoquer des stubs dans le code.

    Donc j'aimerais savoir s'il y a moyen d'enregistrer le client sur le serveur sans bloquer le thread du client et de retourner le message correctement vers le client?
    Si tout est bien configuré ça ne doit pas te poser de problème. Commence d'abord par voir si les appels de méthodes distantes se font correctement.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 92
    Par défaut
    En fait, dans les exemples qu'on peut trouver sur le net, il n'y a qu'un seul serveur Helloworld simple. mais dans mon projet, le serveur il peut enregistrer les clients qui se sont inscrit, et recevoir un message et le diffuser à tous les autres clients.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public interface Groupe extends Remote{
    	public void diffuser(String message) throws RemoteException;
    	public void enregistrer(Client client) throws RemoteException;
    }
    Le client il possède aussi une interface, qui permet au serveur de lui délivrer des messages.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface Client extends Remote{
    	public void recvMessage(String msg) throws RemoteException;
    }
    Maintenant pour mettre en oeuvre l'interface Groupe, il n'y a aucun problème, c'est un peu comme l'exemple Helloworld distribué. le problème est l'accès à l'interface du client depuis le serveur.

    Je veux passer cette interface lors de l'inscription du client. c'est pour cela, je voulais savoir si on peut passer une telle interface en paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Client client = new ClientImpl();
    Client stub = (Client)UnicastRemoteException.exporteObject(client, 0);
    ...
    group.enregistrer(stub);
    Si je fais comme ci-dessus, les messages peuvent être délivrés chez client correctement, mais le programme ne s'arrête pas, il est toujours en attente d'invocations.

    Et si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Client client = new ClientImpl();
    group.enregistrer(client);
    Il faut que l'implémentation ClientImpl soit Serializable, et la délivrance de message (simulé par un println) se passe chez serveur. le message n'est pas diffusé aux clients.

    C'est pour ça j'aimerais savoir quelle est la façon correcte pour passer une interface Remote en paramètre.

  4. #4
    Membre très actif Avatar de _Xavier_
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2009
    Messages : 311
    Par défaut
    Si je comprends bien le serveur peut invoquer des méthodes de ton interface client ? En d'autre terme le client joue lui aussi un rôle de serveur ?
    Si c'est le cas je ne crois pas que ce soit nécessaire. Un seul serveur peut suffire si tu fais une bonne modélisation.

    Pour le reste je voudrais voir comment tu implémentes l'interface du serveur Groupe.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 92
    Par défaut
    Si je comprends bien le serveur peut invoquer des méthodes de ton interface client ? En d'autre terme le client joue lui aussi un rôle de serveur ?
    Oui, c'est ça. Il s'agit en fait d'un système de broadcast. Lorsqu'un client envoie un message au serveur, le serveur parcourt tous les clients qui sont enregistrés chez lui et diffuse le message à tous les clients en appelant la méthode recvMessage() de leurs interface.

  6. #6
    Membre très actif Avatar de _Xavier_
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2009
    Messages : 311
    Par défaut
    Est ce que tu peux mettre tout ton code, en particulier les interfaces et leurs implémentations ?

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/03/2014, 16h00
  2. Envoyer un type via une interface RMI ?
    Par spooli dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 30/05/2011, 20h48
  3. Réponses: 1
    Dernier message: 05/10/2009, 03h50
  4. Passage d'une interface en paramètre de méthode COM
    Par sylvain.cool dans le forum C++
    Réponses: 11
    Dernier message: 18/04/2008, 14h15
  5. Réponses: 10
    Dernier message: 17/05/2006, 11h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo