Java Rmi UnknownHostException

Je suis en train d'écrire un simple RMI fichier, mais pour une raison quelconque, il me donne un inconnue nom d'hôte exception. J'ai tout simplement essayé de tout avant de poser une question. Voici le code pour le projet.

RMI classe d'interface:

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Hello extends Remote {
    String sayHello() throws RemoteException;
}

De La Classe De Serveur:

import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Server implements Hello {

    public Server() {}

    public String sayHello() {
        return "Hello, world!";
    }

    public static void main(String args[]) {

        try {
            Server obj = new Server();
            Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);

            //Bind the remote object's stub in the registry
            Registry registry = LocateRegistry.getRegistry();
            registry.bind("Hello", stub);

            System.err.println("Server ready");
        } catch (Exception e) {
            System.err.println("Server exception: " + e.toString());
            e.printStackTrace();
        }
    }
}

Classe Client:

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Client {

    private Client() {}

    public static void main(String[] args) {

        String host = (args.length < 1) ? null : args[0];
        try {
            Registry registry = LocateRegistry.getRegistry(host);
            Hello stub = (Hello) registry.lookup("Hello");
            String response = stub.sayHello();
            System.out.println("response: " + response);
        } catch (Exception e) {
            System.err.println("Client exception: " + e.toString());
            e.printStackTrace();
        }
    }
}

Lorsque je l'exécute sur localhost il tourne bien, mais pour la vie de moi je ne peux pas obtenir ce à exécuter sur le réseau entre les deux machines. J'ai essayé:

  • De connecter les machines sur le Wifi.
  • De la connexion via ethernet, donc elles ont des adresses comme 192.168.1.1 et 192.168.1.2 respectivement. Les deux machines peuvent ping les uns les autres très bien. Si je nma -PN le serveur depuis le client, je peux voir que le port 1099 est ouvert et le rmiregistry est en cours d'exécution. Mais n'importe quelle combinaison de noms de domaine j'ai essayer cela ne fonctionne toujours pas connecter le client au serveur.

Combinaisons que j'ai essayé pour l'entrée de nom d'hôte sur le côté client:

rmi://192.168.1.1
rmi://192.168.1.1:1099

Et peut-être des dizaines plus de toutes les barres obliques etc. encore aucune idée de pourquoi cela ne fonctionne pas (même s'il fonctionne parfaitement sur localhost). Toutes les idées seront les bienvenues.

Pour être complet voici le actualy erreur que j'obtiens:

 java -classpath classes/ Client
Client exception: java.rmi.UnknownHostException: Unknown host: rmi://192.168.1.1; nested exception is:
java.net.UnknownHostException: rmi://192.168.1.1
java.rmi.UnknownHostException: Unknown host: rmi://192.168.1.1; nested exception is:
java.net.UnknownHostException: rmi://192.168.1.1
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:598)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at Client.main(Client.java:14)
Caused by: java.net.UnknownHostException: rmi://192.168.1.1
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:195)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.<init>(Socket.java:375)
at java.net.Socket.<init>(Socket.java:189)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
... 5 more
Avez-vous essayez juste d' '192.168.1.1'? Un nom d'hôte est le nom de la machine, et ne doit pas inclure un "protocole" - ce n'est pas une URI/URL.
java -classpath classes/ Client ici, je ne suis pas le voir n'importe quel argument , l'argument qu'êtes-vous en passant pour Client principal de la méthode? à la fois dans localhost cas et à distance de boîtier de l'ordinateur?
Je l'ai fait essayer 192.168.1.1. Comme je l'ai mentionné, j'ai tout simplement essayé de tous les ridicules de combinaisons en maintenant et ils ne travaillent pas. L'argument n'est-ce pas parce que cette erreur a été d'une autre course où j'ai été tout simplement le codage en dur le nom d'hôte comme "rmi://192.168.1.2" etc. assurez-vous que le code n'était pas le problème.
Alors quel est le problème actuel lorsque vous essayez d'appeler LocateRegistry.getRegistry("192.168.1.1")? Et est-ce vraiment l'adresse IP du serveur? Il ressemble plus à l'adresse d'un routeur pour moi.
Ce problème a été résolu. Je vais juste poster ma propre solution. Apparemment exécutant le serveur comme java -Djava.rmi.serveur.hostname=192.168.1.1 Serveur résout le problème. Lorsque le client appelle le serveur et obtient en retour un talon, ce tampon contient cette propriété et java définit cette propriété à localhost par défaut. C'est pourquoi il semble bien que votre client se connecte à un hôte distant, il se bloque en disant: connexion refusée sur localhost.

OriginalL'auteur user1822343 | 2012-11-13