RMI Methodenaufruf funktioniert nur lokal

sebileiste

Mitglied
Hallo,

erstmal der Code:

ServerInterface.java
Java:
import java.rmi.Remote;
import java.rmi.RemoteException;


public interface ServerInterface extends Remote{
	
	public String hello(String text, ClientInterface c) throws RemoteException;

}

Server.java
Java:
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;


public class Server extends UnicastRemoteObject implements ServerInterface {

	protected Server(String ip) throws RemoteException {
		super();
		LocateRegistry.createRegistry(1099);
		LocateRegistry.getRegistry(1099);
		try {
			Naming.rebind("//" + ip +"/RMI", this);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public String hello(String text, ClientInterface c) throws RemoteException {
		c.notifyme();
		String ret = "Hello " + text;
		return ret;
	}
	
	public static void main(String[] args){
		try {
			Server server = new Server(args[0]);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}

}

ClientInterface.java
Java:
import java.rmi.Remote;
import java.rmi.RemoteException;


public interface ClientInterface extends Remote {
	
	public void notifyme() throws RemoteException;

}

Client.java
Java:
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.RemoteObject;
import java.rmi.server.UnicastRemoteObject;


public class Client implements ClientInterface {

	
	public Client(String ip){
		super();
		
		try {
			LocateRegistry.getRegistry(ip);
			UnicastRemoteObject.exportObject(this,0);
			Remote ro = Naming.lookup("//" + ip + "/RMI");	
			System.out.println("Lookup done ... trying to communicate");
			ServerInterface server = (ServerInterface) ro;
			System.out.println(server.hello("Client", this));			
				
		} catch (NotBoundException e) {
			e.printStackTrace();
		}	
		
		catch (RemoteException e) {
			e.printStackTrace();
		}
		catch(MalformedURLException e)
		{
			e.printStackTrace();
		}

	}
	
	@Override
	public void notifyme() throws RemoteException {
		System.out.println("Serverfunction hello() here ...");
		
	}
	
	public static void main(String[] args){
		Client c = new Client(args[0]);
	}

}
Das ganze funktioniert lokal wunderbar, sobald ich aber den Client auf einem anderen Rechner im Netzwerk starte funktioniert zwar der Lookup, wenn ich aber eine Methode auf dem Server aufrufe bekomme ich folgende Exception(s):
Code:
java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is: 
	java.net.ConnectException: Connection refused
	at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601)
	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.invoke(UnicastRef.java:110)
	at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
	at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
	at $Proxy1.hello(Unknown Source)
	at Client.<init>(Client.java:23)
	at Client.main(Client.java:48)
Caused by: java.net.ConnectException: Connection refused
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
	at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
	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)
	... 8 more

Wo steckt der Fehler? Bzw. was habe ich vergessen?

Vielen Dank schonmal für eure Bemühungen!

Grüße, Sebastian
 
Zuletzt bearbeitet:
Problem gefunden:

127.0.0.1 & 127.0.1.1 Einträge in /etc/hosts auskommentieren ... Nun möchte ich mein Programm aber auf Rechnern im Netzwerk nutzen, auf denen ich keine root-Rechte habe ... gibts da evtl. noch ne andere Lösung?
 
Ich muss leider zurückrudern, es funktionierte genau einmal, nun steh ich wieder da, Binding und Lookup funktionieren. Kommunikation zwischen den Teilnehmern endet in einem Timeout, lokal funktioniert alles prächtig. Ich bin für jede Idee sehr dankbar 🙁
 
Irgendwie find ich die 127.0.1.1 als Server IP Adresse etwas befremdlich - vermutlich landest du immer auf dem Loopback Device der Maschine auf dem du den Client ausführst.

Würde da einmal ansetzen ;-)

Viele Grüße,
David
 
Laut deinem Client Code ist der erste übergebene Parameter beim Starten die IP Adresse des Servers.

Viele Grüße,
David
 
Ja, richtig, die gebe ich ja auch an ... der Lookup fünktioniert ja auch ... entweder steh ich grad mächtig auf dem Schlauch oder wir reden aneinander vorbei 😀
 
Öhm, gibts einen Grund warum du auf Serverseite erst eine Registry erzeugst und dann noch getRegistry() aufrufst? Da müsste doch createRegistry() ausreichen?

Vielleicht hilft dir ja auch meine Signatur weiter 😉
 
Gute Frage, hab das getRegistry() rausgeworfen ... änder aber leider nix: Lookup ok, dann Timeout anstelle von Methodenaufruf. Und das mit dem LookUp funktioniert auch nur in eine Richtung. Starte ich auf dem Ubuntu-System den Server, funktioniert der LookUp, in die andere Richtung funktioniert nichtmal der LookUp, TimeOut als Ergebnis habe ich aber auch hier. Irgendwie herrscht hier bei mir grad die reine Willkür oO

Hats von euch nicht zufällig mal jemand bei sich lokal versucht? 😀

RMI ist vorgegeben, von daher hilft mir dein Link nur für spätere Aufgaben weiter ;-)
 
Ich hab mal die hello()-Methode auf dem Server um eine Konsolenausgabe erweitert, um zu schauen, ob der Methodenaufruf überhaupt ankommt ... und siehe da, ca 3min nach dem Lookup des Clients bekomm ich die Ausgabe auf dem Server ... nach weiteren ~3min kommt dann schliesslich der Timeout. Womöglich würde ohne Timeout auch irgendwann die Antwort des Servers beim Client ankommen. Irgendwas läuft doch dort komplett schief -.-
 
Problem solved:

java -Djava.rmi.server.hostname=serverhostname Server serverhostname
java -Djava.rmi.server.hostname=clienthostname Client serverhostname

Danke für die Unterstützung 🙂
 
Normalerweise ist das nicht nötig. Das deutet auch seltsame hosts/DNS Einträge hin. Check mal in beiden Richtungen die Namensauflösung.
 

Zurück
Oben