RMI über Netzwerk (nicht lokal !)

zerrome

Grünschnabel
Hallo,
ich habe da ein Probelm, komm überhaupt nicht weiter, kann jemand von euch helfen ?
Also, ich habe zwei kleine Java Programme geschrieben die RMI nutzen, einen Server und einen Client...
Der Client kann aber nicht connecten, also zur rmi registry schon, aber tcp wohl nicht...


PC1 opensuse 10.3 und PC2 opensuse 10.2

Das Server Programm auf PC1 ist erreichbar von PC2 (getestet mit telnet).
Es ist bei beiden Programmen ein Security Manager installiert (siehe code).
Meine rmi.policy datei hat den Inhalt und ist bei beiden Programmen gleich :
Code:
grant{
       permission java.security.AllPermission;
    };

Meine Vermutung ist das da irgenwas mit den Security Manager rechten schief geht (die globale Java Security.policy erlaubt erweiterungen über Kommandozeile)...
Bekomme die Exception vom Client :
Code:
Registry Remote obj: Server
java.rmi.ConnectException: Connection refused to host: 127.0.0.2; nested exception is: 
	java.net.ConnectException: Connection refused

Wie man an der Ausgabe sieht, kann der Client sich von der Registry auf PC1 das remote object "Server" holen bzw. kennt es, aber mehr dann auch nicht !

Das ist die Ausgabe wenn das Server Programm nicht läuft :
Code:
java.rmi.ConnectException: Connection refused to host: 192.168.0.11; nested exception is: 
	java.net.ConnectException: Connection refused



Code vom Client:
Code:
try {
			
			RMISecurityManager sm=new RMISecurityManager();
			System.setSecurityManager(sm);						
			
			Registry registry=LocateRegistry.getRegistry(ip,port);
			System.out.println("Registry Remote obj: "+registry.list()[0]);
			
		       serverInterface server=(serverInterface)registry.lookup(registry.list()[0]);   		    
		    	
		    
		    
		    System.out.println(server.method());
		    }
		
		    catch (Exception ex)
		    {
		    	System.out.println(ex);
		     }

Bin da mitlerweile total ratlos !
Wo kommt die 127.0.0.2 her? in der /etc/hosts steht nix davon.

So erstmal erschlagen mit Fragen, Vermutungen und Code, bitte bitte, hat jemand ne Idee? Oder einen Vorschlag?
 
Zuletzt bearbeitet:
hi,


aus dem titel entnehme ich das du über irgendeine externe verbindung gehst...

1.) es stehen nur locale addressen in deinen fehlermeldungen...?

2.) rmi kommt durch eine firewall nicht ohne weiteres durch, es muß über die 80 oder wie auch immer expliziet getunnelt werden ( rmi verwendet dynamische ports)...bzw zum testen mal die firewalls ausschalten...

hoffe dir hilft das weiter...
 
Hallo,
danke für eure Antworten !
So habe nochmal etwas rumprobiert...
@ _jsd_ :Firewalls waren aus . Aber der server war nicht richtig ans Netzwerkinterface registriert,
hab ich geändert, allerdings ohne erfolg, also geht immer noch nicht...

Server Code:
Code:
final int port=2000;	  
	  
	  try {
		  
		  RMISecurityManager sm=new RMISecurityManager();
		  System.setSecurityManager(sm);
		
		  LocateRegistry.createRegistry(port); //erstellt registry an port
		  Registry registry = LocateRegistry.getRegistry( "192.168.0.11",port); //bindung an netzwerk interface 
		  System.out.println("Registry Port: "+port);
		  
		  registry.rebind("Server",new server());
		  System.out.println("Remote obj: "+registry.list()[0]);
		  }
	  
	  catch (RemoteException re) {
		  System.out.println(re.getMessage());
		  }

ausgabe des Servers beim Start :
Code:
Registry Port: 2000
Remote obj: Server


So wie ich das sehe registriert der Server sich richtig, auch das remote objekt erscheint in der registry...

@ Tom : Hatte mir vorher die tutorials schonmal angesehen... Erkenne da
keinen großen unterschied, außer dass du die registry nicht im programm erstellst, keine Security Manager nutzt und den Standart port der registry verwendest. (na ja schon paar unterschiede)

Wenn ich die Programme lokal laufen lasse, gehts ja auch. Nur über netzwerk nicht... und die komische Fehlermeldung mit der 127.0.0.2 ist mir ein rätsel, weil wenn der Server nicht läuft, "wechselt" die fehlermeldung zur richtigen ip also 192.168.0.11 (siehe vorheriger post)
 
Hallo,

wenn du dir auch mein zweites Beispiel angeschaut hättest, hättest du gesehen das ich dort auch eine RMIRegistry programmatisch starte...

Weiterhin liegt dein Fehler immer noch daran, dass du deine RMIRegistry auf einem anderen Interface laufen lässt (intern) als das das von Client Verbindungen benutzt wird (extern).

Gruß Tom
 
Hi,
äh da komm ich nicht ganz mit... also ich dachte mit dem Befehl :
LocateRegistry.createRegistry(port);

erstellt man eine RMIRegistry auf besagtem port.

Dann mit :
registry = LocateRegistry.getRegistry( "192.168.0.11",port);

die Bindung an das interface.
Danach registrieren des objekts...


Könntest du vielleicht bischen code Posten, um mir zu zeigen wo der fehler liegt?

Stimmt bei dem zweiten beispiel startest du die RMIRegistry im Programm...
 
hi,

kannst mal bitte genauer beschreiben welcher rechner wo läuft ( network) und wo die registry läuft und wer nun von außen nach innen und umgedreht muß....

@thomas...es ist eigentlich nicht notwendig rmi das zu benutzende interface zu zu weisen, da das os das richtige sucht...

@zerrome...wenn du über externes netz gehst mußt du portforwarding machen, und das ist bei rmi ohne tunnel bescheiden, da es dynamische ports nutzt ( nicht für registry aber fürs remoteobject)...hast du vieleicht mal dran gedacht vpn zu nutzen da ersparst dir arbeit...und ist sicherer

hmf
 
Hallo,
danke dass Ihr da am Ball bleibt.
Also, auf beiden Rechnern läuft linux opensuse.
Beide sind mit Wlan und Dlink Router im Netzwerk. Der eine Rechner allerdings mit
ndiswrapper und dem Windows Treiber, macht aber soweit keine Probleme.
Beide Firewalls sind aus, IP des einen Rechner ist 192.168.0.11 (Server Programm) und die IP des anderen ist 192.168.0.112 (Client). Beide rechner erreichen sich mit ping. Ganz normales lokales Netzwerk (allerdings halt Wireless...).
Der Server erstellt die Registry, im Programm, diese läuft auch weil wenn ich sie per hand z.B. mit "rmiregistry 2000" starten will geht das nicht mehr, weil das Programm schon mit der software rmiregistry dann auf dem port läuft, soweit ja auch ok.
Ich kann auch mit der Client Software den Namen des Remote objekts an der Registry erfragen mit dem Befehl "registry.list()[0]"... nur die Verbindung klappt nicht, zum verzweifeln !!

Nur damit ich den Ablauf verstehe,

1. Server Erstellt Registry die auf nem Port lauscht
2. Server meldet sich an der Registry an
3. Server meldet Remote Objekt an der Registry an

4. Client meldet sich an der Entfernten Registry an
5. Client holt sich daraus Remote Objekt

dann sollte die Verbindung stehen oder?
Bei Punkt 5 geht bei mir auf jeden fall nix mehr...
 
hi,

geht also doch übers lokale lan...

versuche mal
Code:
Naming.lookup( "host:2000/name");

auf http://www.gossi23.de/jsd/ gibts ein RMI/CORBA TestTool das brauch im ClassPath nur das Interface des Servers...damit kannst du mal versuchen ob klappt...das ding hat auch nen nameserviceadministrator...wenns dann immer noch nicht geht...post mal bitte den kompletten quellcode oder stell ihn als download zur verfügung

hmf
 
So,
habs nochmal mit :

Code:
serverInterface server= (serverInterface)]Naming.lookup("//192.168.0.11:2000/Server");

probiert, geht nicht... gleiche Fehlermeldung beim Client wie vorher auch schon immer:

Code:
java.rmi.ConnectException: Connection refused to host: 127.0.0.2; nested exception is: 
	java.net.ConnectException: Connection refused

hab mir das test Tool mal angeschaut, findet beim Client erstellen das Server Interface nicht, wo soll das hin, damit der das findet?
Mir ist nicht ganz klar wie ich da den Pfad angeben soll ...
Code:
java -classpath .;{$libs} -jar jTestTool.jar -v

Als Anhang mal beide Programme...
Danke im Vorraus
 

Anhänge

  • serverRmi.zip
    17,8 KB · Aufrufe: 77
  • clientRmi.zip
    4,2 KB · Aufrufe: 66
Zurück