RMI Connection refused bei RMI-Registry

Hatschi

Aktives Mitglied
ich hab mal ne Abschrift von Java-Ist-Auch-Eine-Insel:

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


public interface Adder extends Remote {
	public int add(int x, int y) throws RemoteException;
}
Java:
public class AdderImpl implements Adder {
	public int add(int x, int y) {
		return x+y;
	}
}
Java:
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class Server {
	public static void main(String[] args) throws RemoteException {
		final int PORT = Registry.REGISTRY_PORT;
		
		LocateRegistry.createRegistry(PORT);
				
		AdderImpl adder = new AdderImpl();
		Adder stub = (Adder)UnicastRemoteObject.exportObject(adder, 0);
		
		Registry registry = LocateRegistry.getRegistry();
		registry.rebind("Adder", stub);
		//UnicastRemoteObject.unexportObject(adder, true);
	}
}
Java:
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Client {
	public static void main(String[] args) throws RemoteException, NotBoundException {
		final int PORT = Registry.REGISTRY_PORT;
		
		Registry registry = LocateRegistry.getRegistry();
		Adder adder = (Adder)registry.lookup("192.168.178.13:" + PORT + "/Adder");
		System.out.println(adder.add(47, 11));
	}
}

es geht um diese Stelle:
Java:
Adder adder = (Adder)registry.lookup("192.168.178.13:" + PORT + "/Adder");

wenn ich das jetzt auf nem zweiten Rechner laufen lasse dann bekomm ich da (also beim Client)
Code:
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: 192.168.2.101; nested exception is: 
	java.net.ConnectException: Connection refused: connect
	at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
	at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
	at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
	at sun.rmi.server.UnicastRef.newCall(Unknown Source)
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at Client.main(Client.java:11)
Caused by: java.net.ConnectException: Connection refused: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(Unknown Source)
	at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
	at java.net.PlainSocketImpl.connect(Unknown Source)
	at java.net.SocksSocketImpl.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.<init>(Unknown Source)
	at java.net.Socket.<init>(Unknown Source)
	at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
	at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
	... 6 more
Das heißt doch, dass er den Server nicht sehen kann, oder?
Anpingen kann ich den aber...
 
Zuletzt bearbeitet von einem Moderator:
Bin mir nicht sicher, es ist schon ziemlich lange her, dass ich was mit RMI gemacht habe.
...müsste man nicht den RMI-Port öffnen?
 
Du müsstest im Client eigentlich [c]LocateRegistry.getRegistry(SERVER_HOST)[/c] aufrufen. Sonst versucht Dein Client auf dem eigenen Host die Registry zu finden. Oder hab ichs falsch verstanden?

Ebenius
 
müsste dann da also stehen:
Java:
LocateRegistry.getRegistry("192.168.178.13:" + PORT)
Aber wäre das nicht eigentlich sinnlos? Das eigentliche "lookup" der Methode mache ich ja später, und zwar mit der IP und dem PORT. Wäre ja eigentlich doppelt-gemoppelt, oder nicht?
 
Zuletzt bearbeitet:
Die API-Doc von [c]Registry.lookup()[/c] sagt:
Returns the remote reference bound to the specified name in this registry.
Sprich: Was Du nicht in die Registry eingetragen hast wird bei [c]lookup()[/c] auch nicht gefunden. In die Registry auf dem Client trägst Du nichts ein, also kann da auch nichts rausgeholt werden.

Ich hab schon ewig nicht mehr mit RMI gespielt, vielleicht verstehe ich's ja falsch.

Nachtrag:
Aber wäre das nicht eigentlich sinnlos? Das eigentliche "lookup" der Methode mache ich ja später, und zwar mit der IP und dem PORT. Wäre ja eigentlich doppelt-gemoppelt, oder nicht?
Dein Aufbau kann ja auch anders aussehen. Man habe einen Server A der als Registrar dient. Man habe vier andere Rechner B-E die verschiedene Dienste ausführen und sich in der Registry auf A anmelden. Man habe weiterhin Clients die alle in der Registry von A nachfragen, aber einzelne Dienste von B-E nutzen wollen. Einmal fragt man eben die Registry (auf A) an und aus der holt man sich die Referenzen zu den Diensten (auf B-E).

Ebenius
 
Zuletzt bearbeitet:
also ich hab das jetzt mal ausprobiert...
Java:
Registry registry = LocateRegistry.getRegistry("rmi://" + args[0] + ":" + PORT);
geht immer noch nicht...
Das interessante daran: schreibe ich das jetzt so, geht das auch nicht wenn ich Server und Client aufm selben Rechner laufen lasse. Trage ich hingegen bei getRegistry nur den Port ein dann geht das (im übrigen genau so, wie wenn ich das ganz weglasse...)
 
Ok, ich habs jetzt gelöst. Der Fehler liegt darin, dass man bei getRegistry die IP und den Port eintragen muss und nicht bei lookup. Ist eigentlich auch klar...

Java:
final int PORT = Registry.REGISTRY_PORT;
final String IP = args[0];
		
Registry registry = LocateRegistry.getRegistry(IP, PORT);
Adder adder = (Adder)registry.lookup("Adder");
 
Ich habe das immer für den Server so gemacht:
Java:
LocateRegistry.createRegistry(Registry.REGISTRY_PORT); //RMI-Registry starten
Registry registry = LocateRegistry.getRegistry();

Vorteil dabei, ich brauche mir um einen Port keine Sorgen machen, es wird der Standard-Port für RMI (1099) belegt. Gleichzeitig wird automatisch die RMI-Registry gestartet. Man braucht das also nicht von Hand oder Skript zu tun.
 

Zurück
Oben