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
et192.168.1.2
respectivement. Les deux machines peuvent ping les uns les autres très bien. Si jenma -PN
le serveur depuis le client, je peux voir que le port1099
est ouvert et lermiregistry
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
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
Vous devez vous connecter pour publier un commentaire.
Cela a été résolu. Je vais juste poster ma propre solution. Apparemment exécutant le serveur comme cela fonctionne: java -Djava.rmi.serveur.hostname=192.168.1.1 Serveur.Le problème était que 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, même si vous liez le serveur à une adresse ip lors de la création d'un registre. 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 parce que le stub il a contient localhost.
OriginalL'auteur user1822343
Juste un commentaire sur la correspondance entre le nom d'hôte et adresse IP: vous pouvez donner le nom que vous localisateur de ce que vous voulez, mais vous devrez insérer une entrée dans votre fichier hosts (C:\Windows\system32...\hosts), par exemple
Alors vous pouvez rmihost1 à l'appel:
OriginalL'auteur George