web-dev-qa-db-fra.com

Exception de connexion Java RMI: connexion refusée à l'hôte/délai d'attente

Je travaille sur un jeu en ligne de commande RMI mais, chaque fois que j'essaie de mon service, je reçois une erreur comme celle-ci:

Java.rmi.ConnectException: Connection refused to Host: 192.168.56.1; nested exception is: 
    Java.net.ConnectException: Connection timed out: connect

C'est la classe principale de ma Server:

public class RMIWar {

    public static void main(String[] args) throws RemoteException, MalformedURLException  {
        try {
            Controle obj = new Controle(4);
            Registry reg = LocateRegistry.createRegistry(1099);
            System.out.println("Server is ready");
            reg.rebind("CtrlServ", obj);
        }
        catch (Exception e) {
            System.out.println("Error: " + e.toString());
        }
    }
}

Le principal pour ma classe Client:

public class RMIWarClient {
    public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException  {
        try {
            Registry registry = LocateRegistry.getRegistry("localhost");
            ControleInt ctrl = (ControleInt) registry.lookup("CtrlServ");
            System.out.println("CtrlServ found...\n");
            BioRMI bio = new BioRMI(null, 5,5,5);
            ctrl.thRegister("Test", bio.atk, bio.def, bio.agi);

        }

        catch (Exception e) {
            System.out.println("Error: " + e);
        }
    }
}

Aucune suggestion?

9
Samuel

Testez si votre port 1099 est disponible (cela signifie bloqué par le pare-feu). De plus, vous n'avez pas mentionné le système d'exploitation que vous utilisez et si vous avez démarré le registre avant l'exécution de votre serveur.

Ce RMI tutorial explique:

Avant de démarrer le moteur de calcul, vous devez démarrer le registre RMI . Le registre RMI est une fonctionnalité simple d'attribution de noms Au serveur qui permet aux clients distants d'obtenir une référence à un objet distant initial .

Par défaut, le registre s'exécute sur le port 1099, comme le vôtre. Comme l'indique le tutoriel, ouvrez simplement une invite de commande (sous Windows) ou un terminal Shell (sous un système d'exploitation de type UNIX) et tapez:

Pour Windows (utilisez javaw si start n'est pas disponible):

start rmiregistry

SE Solaris ou Linux :

rmiregistry &

UPDATE

À la suite du tutoriel Oracle et de mon projet d’autrefois, j’ai remarqué que, dans la classe Server, vous n’exportiez pas l’objet dans le moteur d’exécution RMI. Ensuite, éditez ces lignes:

Controle obj = new Controle(4);
Registry reg = LocateRegistry.createRegistry(1099);
System.out.println("Server is ready");
reg.rebind("CtrlServ", obj);

à:

Controle obj = new Controle(4);
Controle stub = (Controle) UnicastRemoteObject.exportObject(obj, 0);
Registry reg = LocateRegistry.createRegistry(1099);
System.out.println("Server is ready");
reg.rebind("CtrlServ", stub);

Parce que le tutoriel rapporte:

La méthode statique UnicastRemoteObject.exportObject exporte l'objet distant fourni Afin qu'il puisse recevoir des appels de ses méthodes distantes À partir de clients distants.

De même, si vous utilisez le même hôte pour une invocation RMI, il n'est pas nécessaire dans la classe Client:

Registry registry = LocateRegistry.getRegistry("localhost");

Invoquer simplement:

Registry registry = LocateRegistry.getRegistry();

Parce qu'Oracle rapporte:

La surcharge sans argument de LocateRegistry.getRegistry synthétise une référence À un registre sur l'hôte local et sur le port de registre par défaut , 1099. Vous devez utiliser une surcharge qui a un paramètre int. Le registre est créé sur un port autre que 1099.

11
Alberto Solano

Méfiez-vous des ports car ils pourraient être bloqués par un pare-feu. Par exemple, si vous travaillez dans une zone sécurisée telle que votre lieu de travail ou l'université, l'administrateur peut avoir mis en place des protections ...

0
melli-182

J'ai décrit ma solution ici Java.rmi.ConnectException: connexion refusée à l'hôte: 127.0.1.1; and here Impossible de se connecter au serveur MBean de Tomcat via jconsole en Java6 . il s’agissait d’un problème de réseau élémentaire, mais il pourrait arriver à quelqu'un d’autre.

0
Paul

Je ne vois pas comment vous pourriez éventuellement obtenir cette exception de ce code. Selon le code, votre serveur et votre client s'exécutent sur le même hôte et vous ne recevez pas de délais de connexion dans le même hôte.

Donc, en supposant que ce ne soit pas votre vrai code et que vous recherchiez le bon registre (argument de l'hôte à getRegistry()), je vous demanderais si 192.168.56.1 est l'adresse IP que vous vous attendez à voir compte tenu de votre topologie de réseau. C'est une adresse LAN interne et si votre client est en dehors du LAN, il devrait essayer de se connecter à une adresse IP plus publique. Si l'adresse n'est pas celle que vous attendez, je vous renvoie à élément A.1 du RMI FAQ .

0
user207421