# RMI allgemeine Verwirrung



## Centurio (10. Jun 2007)

Hallo erstmal,

ich versuche ein Projekt indem ich Kommunikation über ein Windows XP Netzwerk per Java RMI herstellen will.
Das ganze funktioniert auch wunderschön hier auf meinem Lokalen PC. Ausserdem habe ich es bereits in
einem Netzwerk welches keine Personl Firewall hat probiert und es funktioniert auch da.

Jetzt versuche ich es auf einem anderen Netzwerk mit Windows FIrewall und es geht nicht mehr 

Die Bibliothek:
ich habe die RMI Schnittstelle in eine Bibliothek ausgelagert habe. Diese Bibliothek binde ich sowohl in das Server als auch in das Client Programm mit ein. So braucht der Client keine Klasse nachzuladen.

Das Serverprogramm:
...
LocateRegistry.createRegistry( bla );
Naming.rebind("rmi://localhost:" bla bal bla
...


Das Clientprogramm:
...
Naming.lookup("rmi:// bla bla)
...

Die Fragen:
a) Der Server hat 2 Netwerkadressen, eine für das interne LAN und eine für eine TV Streamkarte. Ich möchte aber nur genau die für die interne LAN benutzen. Wie kann ich ausserdem verhindern, dass er nur die andere nimmt ?

b) Die RMI Registry läuft z.B. auf dem Standard Port 1099, wenn ich aber das Objekt von der Registry zurück bekommen müsste dieses ja einen neuen Port auf dem Server öffnen, mit dem ich dann kommuniziere. Wie heisst dieser Port bzw. muss / kann ich den in der Windows Firewall freigeben ?
per "netstat -an" kann ich erkennen, dass auch andere Ports mit Port 1099 kommunizieren (z.B. wenn ich localhost verwende)

c) Kann es sein, dass die Verbindung auf einem Netwerk ohne Security Manager funktioniert und auf einem anderen ebenfalls Windows XP Netzwerk nicht ohne Security Manager ? Da ich bei dem Programm keinen Security Manager benutze.

Ich hoffe euch nicht zusehr verwirrt zu haben, und freue mich auf eure Antworten

Mfg Centurio


----------



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

Centurio hat gesagt.:
			
		

> a) Der Server hat 2 Netwerkadressen, eine für das interne LAN und eine für eine TV Streamkarte. Ich möchte aber nur genau die für die interne LAN benutzen. Wie kann ich ausserdem verhindern, dass er nur die andere nimmt ?


In dem du dem Client sagst, mit welcher IP er sich verbinden soll.

```
Naming.rebind("rmi://192.168.0.10/Server);"
```



			
				Centurio hat gesagt.:
			
		

> b) Die RMI Registry läuft z.B. auf dem Standard Port 1099, wenn ich aber das Objekt von der Registry zurück bekommen müsste dieses ja einen neuen Port auf dem Server öffnen, mit dem ich dann kommuniziere. Wie heisst dieser Port bzw. muss / kann ich den in der Windows Firewall freigeben ?
> per "netstat -an" kann ich erkennen, dass auch andere Ports mit Port 1099 kommunizieren (z.B. wenn ich localhost verwende)


Das sind sicher die Port die der Client raus zu zur Kommunikation nutzt...
Der Server hat nur einen Port: Den den du eingestellt hast bzw. den Statndard-RMI-Port. Der Port müss übrigens auch in einer Firewall geöffnet werden.



			
				Centurio hat gesagt.:
			
		

> c) Kann es sein, dass die Verbindung auf einem Netwerk ohne Security Manager funktioniert und auf einem anderen ebenfalls Windows XP Netzwerk nicht ohne Security Manager ? Da ich bei dem Programm keinen Security Manager benutze.


Eigentlich funktioniert das ohne SecurityManager meines Wissen nur lokal, aber nicht mehr im Netz. Dort muss der Server und der Client einen SecurityManager instanziieren (erste Zeile im Konstruktor) und wenn der Client ein Applet ist, muss er signiert sein.


----------



## Centurio (11. Jun 2007)

Ah Danke das ist erstmal sehr hilfreich.
Aber warum startet er den Server nicht auf allen lokalen Ports, wenn
ich "localhost" verwende ?

Wegen Security Manager kann ich do so tun :


```
System.setProperty("java.security.policy", "allpermission.policy"); 
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }
```

In der Datei allpermissions.policy stehen alle Policys


----------



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

So sollte es eigentlich aussehen:

```
System.setProperty("java.security.policy", "allpermission.policy"); 
System.setSecurityManager(new RMISecurityManager());
```


----------



## Centurio (11. Jun 2007)

Ah okay danke schön.


			
				L-ectron-X hat gesagt.:
			
		

> Eigentlich funktioniert das ohne SecurityManager meines Wissen nur lokal, aber nicht mehr im Netz. Dort muss der Server und der Client einen SecurityManager instanziieren (erste Zeile im Konstruktor) und wenn der Client ein Applet ist, muss er signiert sein.


was bedeutet (erste Zeile im Konstruktor) ? spielt es eine Rolle >wann< ich den Securitymanager installiere ?


----------



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

Das ist für meine Begriffe die beste Position. Jedenfalls noch vor den Zugriffen auf die RMIRegistry und dem Binden der Remote-Objekte.


----------



## Centurio (12. Jun 2007)

Dankeschön nochmal,

dann habe ich noch eine Frage, da du dich scheinbar sehr gut darin auskennst.

Ich hab das Tutorial von Sun dazu gelsen
http://java.sun.com/docs/books/tutorial/rmi/implementing.html

Ich habe gelernt, dass man die Implementierung des RMI Interfaces etwa so schreibt:


```
public class RemoteImp extends UnicastRemoteObject implements RemoteInterface
```

im Tutorial leiten SIe die Implentierung also RemoteImp allerdings nicht von UnicastRemoteObject ab, sondern exportieren es etwa so:


```
RemoteImp engine = ....
RemoteInterface stub =
    (RemoteInterface) UnicastRemoteObject.exportObject(engine, 0);
```

Hier kann man mit dem 2.Parameter der Methode exportObject() den Port bestimmen, auf dem dieses Object auf dem Server hört (0 = sucht sich selber einen aus).

Im Tutorial binden Sie dann "stub" in die Registry wobei ich hingegen "this" in die Registry binde.


Die Frage ist, was ist der Unterschied zwischen den 2 Varianten ?

Mfg Centurio


----------

