Warum RMI localhost-client verwendet eine keine localhost-ip verbinden, den RMI-server localhost
Sind wir mit einem client/server, RMI-Kommunikation auf dem gleichen Rechner (also alle sollte die ip "localhost").
Starten wir die Registrierung (mithilfe der Standard-port 1099)
registry = LocateRegistry.createRegistry(port);
- und export-einige Objekte, die RMI-registry
Naming.rebind("//" + "localhost" + ":" + port + "/" + name, object);
Aus einem anderen Prozess, den wir abrufen, einige Objekte (alles erinnern, was läuft in localhost)
MyRemoteObject ro = (MyRemoteObject) Naming.lookup("//" + "localhost" + ":" + port + "/" + name);
Das Problem passiert, wenn Sie die app ausführen, beginnend mit dem lokalen Netzwerk arbeiten, und in der Mitte der Prozess, den Sie deaktivieren Sie die Netzwerkverbindung.
Wenn Sie die app laufen und die LAN ist arbeiten kein Problem popup, und wenn Sie die app laufen und die LAN nicht funktioniert ist kein Problem-popup. Es passiert einfach, wenn Sie ändern Sie die LAN-während der Ausführung der app.
Geworfene Ausnahme während der Ausführung zu Benennen.lookup () - Methode ist diese hier:
java.lang.RuntimeException: java.rmi.ConnectIOException: Exception creating connection to: 192.168.x.x; nested exception is:
java.net.NoRouteToHostException: No route to host: connect
Debugging-ein kleines bisschen fand ich heraus, dass die
RemoteObject ($Proxy0) -> RemoteObjectInvocationHandler -> UnicastRef2 -> LiveRef -> TCPEndpoint
hatte die ip des host (z.B.: 192.168.x.x) anstelle von "localhost" oder "127.0.0.1" (was wäre es, was ich wollte).
Und die isLocal boolean der liveRef Objekt ist immer falsch.
Ich weiß nicht, ob es klar genug. Sorry!!!
Haben Sie irgendwelche Vorschläge?
Meine Versuche:
Habe ich versucht, diese Lösungen
- Ausführen der jvm mit -Djava.rmi.server.hostname=localhost argument
- Neu definieren RMIServerSocketFactory zurück 127.0.0.1 everytime. (TCPEndpoint hat 192.168.x.x ip und isLocal ist immer false)
- Nennen binden und Suche kein host in der URI. Dies soll bedeuten localhost.
aber keiner von Ihnen gearbeitet haben.
Jede Anregung willkommen sein wird.
InformationsquelleAutor RMI-thinker | 2010-11-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
java.rmi.server.hostname
sollte den trick tun. Sie setzten es auf dem server, richtig?Wenn
java.rmi.server.hostname=localhost
nicht so funktioniert, wie überjava.rmi.server.hostname=127.0.0.1
oderjava.rmi.server.hostname=::1
?Was ist, wenn nur IPv6 aktiv ist? Wird
127.0.0.1
automatisch übersetzt::1
irgendwie?Wenn nur IPv6 aktiv ist, dann einfach "localhost" sollte den trick tun just fine. Sie können auch versuchen, eine Einstellung von "::1" und sehen, ob das funktioniert. "127.0.0.1" wird bedeutungslos sein, um IPv6-Netzwerk-stack, AFAIK. Es gibt keine automatische übersetzung.
InformationsquelleAutor Neeme Praks
Könnten Sie versuchen, starten Sie Ihren server mit dieser Eigenschaft
-Djava.rmi.server.hostname=localhost
Siehe auch Abschnitt 3.5.4
Dies, weil der server bindet sich an eine Schnittstelle, entweder 127.0.0.1 oder 192.168.x.x
InformationsquelleAutor stacker
Sorry, Jungs. Mein Fehler.
Wie Sie ich wurde die Einstellung "java.rmi.server.hostname=localhost" - argument, um die Kunden-Prozesse. Es runned wie Charme, wenn ich setted das argument zu verarbeiten, die RMI-server.
Vielen Dank.
InformationsquelleAutor RMI-thinker