RMI allgemeine Verwirrung

Status
Nicht offen für weitere Antworten.
C

Centurio

Gast
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

Gesperrter Benutzer
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.
Code:
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.
 
C

Centurio

Gast
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 :

Code:
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

Gesperrter Benutzer
So sollte es eigentlich aussehen:
Code:
System.setProperty("java.security.policy", "allpermission.policy"); 
System.setSecurityManager(new RMISecurityManager());
 
C

Centurio

Gast
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

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

Centurio

Gast
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:

Code:
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:

Code:
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
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben