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 :

Problèmes de connexion client / serveur en RMI


Sujet :

Entrée/Sortie Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut [Résolu] Problèmes de connexion client / serveur en RMI
    Bonjour.


    Je développe actuellement une application client/serveur en RMI.
    Pour rendre mon application portable (éviter de l'exécuter en passant par Eclipse), j'ai décidé de créer un .JAR pour le client et un pour le serveur.

    Quand je test mon application en locale elle marche parfaitement, mais quand je test en réseau cela ne fonctionne pas !

    Dès le premier appel du client à une fonction du serveur (à savoir isPseudoDispo), j'obtient l'erreur suivante :
    java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
    java.net.ConnectException: Connection refused: connect
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
    at sun.rmi.server.UnicastRef.invoke(Unknown Source)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
    at $Proxy0.isPseudoDispo(Unknown Source)
    at client.ControleurClient.getConnexion(ControleurClient.java:126)
    at client.ControleurClient.setConnexionParams(ControleurClient.java:114)
    at client.FenetreConnexion$1.run(FenetreConnexion.java:187)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
    Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
    ... 18 more
    Connection refused to host: 127.0.0.1; nested exception is:
    java.net.ConnectException: Connection refused: connect

    Pourquoi l'host est il 127.0.0.1 alors que je met en dur, dans le code du serveur et du client, l'adresse IP du serveur et pourquoi refuser la connexion ?


    Merci d'avance pour vos réponses

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 136
    Points : 100
    Points
    100
    Par défaut
    salut,

    poste ton code (bind du serveur + connexion du client)

    a+

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Je suis désolé, mais je ne sais pas ce que veut dire "bind du serveur" (je vais juste mettre le code ...).
    Il faut noter que la classe ControleurServerInt est l'intermédiaire entre le client et le serveur et n'est composée que des entêtes des fonctions du ControleurServer.

    De plus, je rappel que ce client/serveur fonctionne parfaitement en local et en réseau en le lançant par Eclipse.
    Mon problème est que les .JAR réalisés ne fonctionne qu'en local. En réseau, l'exception cité dans mon 1er message est levée.

    Côté client (main) :
    package client;
    public class Client {
    public static void main(String[] args) {
    ClassLoader myClassLoader = Thread.currentThread().getContextClassLoader();
    URL file = myClassLoader.getResource("client/Client.policy");
    System.setProperty("java.security.policy",file.toString());
    if(System.getSecurityManager() == null){
    System.setSecurityManager(new SecurityManager());
    }
    new ControleurClient();
    }
    }
    Côté client ControleurClient :
    package client;
    public class ControleurClient {

    private ControleurServerInt controleurServeur;

    public ControleurClient(){
    SwingUtilities.invokeLater(new Runnable(){
    public void run(){
    fenetreConnexion = new FenetreConnexion(ControleurClient.this);
    fenetreConnexion.setVisible(true);
    }
    });
    }

    /*FenetreConnexion sert uniquement à saisir un login, une adresse IP et un numéro de port qu'elle transmet au ControleurClient par la fonction setConnexionParams. C'est sur la fonction "isPseudoDispo" (en rouge) que l'exception est levée.*/
    public boolean setConnexionParams(String nom,String adresse, int port){
    this.nomJoueur = nom;
    this.serverIP = adresse;
    this.serverPort = port;
    return this.getConnexion();
    }


    private boolean getConnexion(){
    try{
    Registry registry = LocateRegistry.getRegistry(this.serverIP,this.serverPort);
    this.controleurServeur = (ControleurServerInt)registry.lookup("Controleur");
    if(this.controleurServeur.isPseudoDispo(this.nomJoueur)){
    System.out.println(this.controleurServeur.welcome_message());
    this.controleurServeur.nouveauClient(this.nomJoueur);
    this.startServerListener();
    SwingUtilities.invokeLater(new Runnable(){
    public void run(){
    fenPres = new FenPres(ControleurClient.this);
    fenPres.setVisible(true);
    }
    });
    return true;
    }
    else{
    JOptionPane.showMessageDialog(null, "Le pseudo est déjà utilisé" ,"Pseudo existant", JOptionPane.ERROR_MESSAGE);
    return false;
    }
    }
    catch(RemoteException re){
    /*Le programme exécute ce catch*/
    JOptionPane.showMessageDialog(null, "Le serveur "+serverIP+" est introuvable" ,"Serveur introuvable", JOptionPane.ERROR_MESSAGE);
    re.printStackTrace();
    System.out.println(re.getMessage());
    }
    catch(NotBoundException nbe){
    nbe.printStackTrace();
    }
    return false;
    }
    }


    Côté server (main) tout ce passe correctement, il attend la connexion de clients :
    package server;
    public class Server {
    public static void main(String[] args) {
    String usage = "Usage: Newserver [-p port] [-f tracefilename]";
    System.out.println(usage);
    //On met d'abord en place la politique de securite du programme, elle est defini dans le fichier "server.policy"
    ClassLoader myClassLoader = Thread.currentThread().getContextClassLoader();
    URL file = myClassLoader.getResource("server/Server.policy");
    System.setProperty("java.security.policy",file.toString());
    if(System.getSecurityManager() == null){
    System.setSecurityManager(new SecurityManager());
    }

    //prise en compte des arguments
    int portConnexion = 18500;
    String nomFichierTrace="trace.txt";
    System.out.println("*** Attention, ce programme utilisera deux ports pour fonctionner: "+portConnexion+" pour le rmiregistry et "+portConnexion+1);
    System.out.println("*** fichier trace utilise: "+nomFichierTrace)

    try{
    //Creation du registre sur le port specifie
    LocateRegistry.createRegistry(portConnexion);
    Registry registry = LocateRegistry.getRegistry("Adresse IP de la machine sur laquel va tourner ce serveur ",portConnexion);
    ControleurServerInt controleurServerStub;
    ControleurServer controleurServer = new ControleurServer(nomFichierTrace);

    //Exportation du controleur avec ecoute sur le port n+1
    controleurServerStub = (ControleurServerInt)UnicastRemoteObject.exportObject(controleurServer,portConnexion+1);

    welcomeMessage(portConnexion);

    //Liaison entre le registre RMI et l'objet exporte
    //le server est maintenant en boucle infinie et attend les connexions clientes
    registry.rebind("Controleur",controleurServerStub);
    }
    catch(Exception e){
    System.out.println("Remote Exception dans server.Server, methode: main");
    e.printStackTrace();
    }
    }

    static private void welcomeMessage(int portConnexion){
    System.out.println("Bienvenue sur le serveur de Delta Design");
    }

    }
    Côté server ControleurServeur (juste fonctions utiles) :
    package server;
    public class ControleurServer implements ControleurServerInt{

    //Vecteur de pseudo permettant de savoir si un pseudo est disponible ou pas
    private Vector<String> VectPseudo;
    private ReentrantReadWriteLock verrouVectPseudo = new ReentrantReadWriteLock();
    private final Lock readVectPseudo = this.verrouVectPseudo.readLock();
    private final Lock writeVectPseudo = this.verrouVectPseudo.writeLock();

    public boolean isPseudoDispo(String pseudo) throws RemoteException{
    //La syncrhonisation permet de n'avoir qu'un seul client qui consulte le vecteur
    this.readVectPseudo.lock();
    try{
    for(int i=0; i<VectPseudo.size(); i++) {
    if(VectPseudo.elementAt(i).compareTo(pseudo) == 0)
    return false;
    }
    }
    finally{
    this.readVectPseudo.unlock();
    }
    return true;
    }
    public String welcome_message() throws RemoteException {
    String message=" Bienvenu sur le serveur du DeltaDesign Game";
    return message;
    }
    }


    Voila voila, j'espère que tout est là
    Si des choses manquent ou ne sont pas claire, n'hésiter pas.

    Merci d'avance.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    par curiosité, tu peux rajouter un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("Connection à "+this.serverIP+":"+this.serverPort);
    devant Registry registry = LocateRegistry.getRegistry(this.serverIP,this.serverPort);

    histoire d'être sur que les paramètres passés sont corrects?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    J'obtient :
    Connexion à "@ IP du serveur":18500
    Les paramètres sont donc corrects.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    pour le binding, coté serveur, t'as bien mis l'ip aussi ou t'as utilisé localhost?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    J'ai mis l'@ IP.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Bonjour.

    Le problème est résolu : quand on lance le .jar du serveur, il faut juste rajouter une option pour lui indiquer l'host name où se lancer ... dégouter !

    Voici la commande pour ce qui sont intéressés :
    Côté serveur :
    java -jar Server.jar -Djava.rmi.server.hostname=developpez.com
    Côté client :
    java -jar Client.jar


    Concernant la compilation du .jar, Eclipse (version ganymede) peut le faire si vous choisissez "Export" puis l'option "Runnable JAR File".

    Sinon en commande :
    Pour le client :
    => javac Client/*.java
    => jar cvf Client.jar Client/*.class
    Pour le serveur :
    => javac Server/*.java
    => jar cvf Server.jar Server/*.class

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/08/2014, 10h17
  2. [Android] Problème connexion client/serveur
    Par Malip dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 21/05/2014, 14h39
  3. Problème de connexion client serveur en C++
    Par benhaoussea dans le forum Débuter
    Réponses: 1
    Dernier message: 08/03/2013, 11h37
  4. problème sur la connexion client/serveur
    Par bombers dans le forum C
    Réponses: 1
    Dernier message: 24/05/2011, 10h26
  5. Réponses: 16
    Dernier message: 05/06/2008, 11h32

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