# RMI Server Start --Schwierigkeiten



## akeller (6. Jun 2007)

Hallo,

ich habe wirklich wenig Ahnung von Programmieren, muss jetzt aber ein Buchhaltungsprojekt fuer mein Studium machen. Dabei versuche ich den RMI Server zu starten, um Clients mit dem Server zu verbinden. Programmiert wird mit Java in Eclipse. Ich bekomme staendig eine Fehlermeldung (siehe unten), wenn ich auf Debbug oder Run gehe.

Woran kann es liegen?

Waere sehr dankbar fuer die Hilfe.



```
package BuchhaltungProjekt.src.de.hdm.seifert.BuchhaltungProjekt;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import BuchhaltungProjekt.src.de.xxx.xxxxx.BuchhaltungProjekt.db.*;
import BuchhaltungProjekt.src.de.xxx.xxxxx.BuchhaltungProjekt.data.*;


	
public class KontoServer {

	

	private KontoVerwaltung verwaltung = null;
		
	public KontoServer() throws MalformedURLException {
		try {

			verwaltung =
				new KontoVerwaltungImpl(null,
					KontoMapper.kontoMapper(),
					KontoartMapper.kontoartMapper(),
					BuchungssatzMapper.buchungssatzMapper());
	
			
		
			
			
			Naming.rebind("rmi://keller:1099/KontoVerwaltung", verwaltung);
			System.out.println("KontoVerwaltung in Registry eingetragen...");
			
		}
		catch (RemoteException e) {
			e.printStackTrace();
		}
		}
			
	public static void main(String[] args) throws RemoteException, MalformedURLException {

	KontoServer server = new KontoServer();
	System.out.println("Server gestartet...");
	
	
	}	
}
```


Jetzt die Fehlermeldung




```
java.rmi.ConnectException: Connection refused to host: keller; 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.rebind(Unknown Source)
	at java.rmi.Naming.rebind(Unknown Source)
	at BuchhaltungProjekt.src.de.hdm.seifert.BuchhaltungProjekt.KontoServer.<init>(KontoServer.java:58)
	at BuchhaltungProjekt.src.de.hdm.seifert.BuchhaltungProjekt.KontoServer.main(KontoServer.java:72)
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)
	... 8 more

Server gestartet...
```



Nochmal Danke!

Gruss

Alex


----------



## ExZtEd (6. Jun 2007)

Schon bei der lokalen Registry registriert "LocateRegistry.createRegistry", oder wenn nicht über den Source per rmiregistry?

Und die policies (grant permissions) nicht vergessen.


----------



## akeller (6. Jun 2007)

Wenn ich nur das hier eingebe:
"LocateRegistry.createRegistry(Registry.REGISTRY_PORT);"
ohne
"Naming.rebind("rmi://keller:1099/KontoVerwaltung", verwaltung); 
         System.out.println("KontoVerwaltung in Registry eingetragen..."); 
"
dann bekomme ich keine Fehlermeldung. Wenn ich beide auffuehre gibt es die selbe Fehlermeldung.

Was sind (grant premissions)?


----------



## ExZtEd (6. Jun 2007)

Für die Verwednung von RMi müssen Policies angelegt werde, die den Zugriff auf Deine RMI-Komponenten erlauben, oder eben nicht.
Standardmässig entpricht eine nicht vorhandene Policy einer ACl mit der Bedeutung DENY ALL.

Eine Policy ist eine Datei mit folgendem ähnlichen Inhalt, abhängig von den gewährten Rechten:

grant codeBase "file:/home/jones/src/" {
    permission java.security.AllPermission;
};

Die Datei muss natürlich deiner Anwednung als Parameter noch mitgegeben werden über den Parameter:
-Djava.security.policy=


----------



## semi (6. Jun 2007)

Erstelle zwei Dateien mit jeweils folgendem Inhalt. Nennen wir sie mal "client.policy" und "server.policy".
	
	
	
	





```
grant
{
   permission java.security.AllPermission;
};
```
Gehe dann auf "Run As" -> Run... und klicke auf den Namen deines Programmes unter "Java Application".
Dann füge die folgende Zeile auf der rechten Seite, unter "Arguments" -> "*VM Arguments*" ein.

-Djava.security.policy=./client.policy
bzw.
-Djava.security.policy=./server.policy
beim Server.

Edit:  Ätch, zu spät.  :wink:


----------



## akeller (6. Jun 2007)

Danke fuer die Eklaerung! Ich werde es ausprobieren, werde dazu noch etwas in dem Java-Buch nachlesen.

Noch eine Frage:
Wenn ich den "LocateRegistry.createRegistry" benutze ist mein RMI Server angemeldet oder brauche ich den "Naming.rebind" - Befehl, um mich "de Server" anzumelden?


----------



## ExZtEd (6. Jun 2007)

LocateRegistry.createRegistry(Registry.REGISTRY_PORT); registriert Deine Anwednung für das RMI.
Damit hat es aber noch keinen Namen, über den man es per Client ansprechen könnte.


Dazu muss dann der zweite Schritt, das Naming.rebind() ausgeführt werden.
Damit wird die instanzierte Serverklasse beim RMI angemeldet.


----------



## akeller (6. Jun 2007)

Jetzt kommt etwas Licht zu mir durch, eine logische Kette baut sich auf!!! 

Melde mich, wenn ich es alles ausgefuehrt habe.

Schoenen Abend schoenen Feiertag (in Baden Wuerttemberg)!

Gruss


----------



## L-ectron-X (7. Jun 2007)

Kann auch sein, dass der Port 1099 nicht geöffnet ist...


----------

