tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
18
ZUGRIFFE
4415
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    zerrome zerrome ist offline Mitglied
    Registriert seit
    Nov 2007
    Ort
    Köln
    Beiträge
    17
    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 :
    1
    2
    3
    4
    
     
    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 :
    1
    2
    3
    4
    
     
    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 :
    1
    2
    3
    
     
    java.rmi.ConnectException: Connection refused to host: 192.168.0.11; nested exception is: 
        java.net.ConnectException: Connection refused



    Code vom Client:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    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?
    Geändert von zerrome (08.11.07 um 10:55 Uhr)
     

  2. #2
    _jsd_ Tutorials.de Gastzugang
    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...
     

  3. #3
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    wenn du mehrere Netzwerk Interfaces in deinem rechner hast musst du der RMI Runtime auch sagen welches es benutzen soll...

    Schau mal hier:
    http://www.tutorials.de/forum/java/2...-java-5-a.html
    http://www.tutorials.de/forum/java/2...ipse-plug.html

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  4. #4
    zerrome zerrome ist offline Mitglied
    Registriert seit
    Nov 2007
    Ort
    Köln
    Beiträge
    17
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    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 :
    1
    2
    
    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)
     

  5. #5
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    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
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  6. #6
    zerrome zerrome ist offline Mitglied
    Registriert seit
    Nov 2007
    Ort
    Köln
    Beiträge
    17
    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...
     

  7. #7
    _jsd_ Tutorials.de Gastzugang
    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
     

  8. #8
    zerrome zerrome ist offline Mitglied
    Registriert seit
    Nov 2007
    Ort
    Köln
    Beiträge
    17
    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...
     

  9. #9
    _jsd_ Tutorials.de Gastzugang
    hi,

    geht also doch übers lokale lan...

    versuche mal
    Code :
    1
    
    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
     

  10. #10
    zerrome zerrome ist offline Mitglied
    Registriert seit
    Nov 2007
    Ort
    Köln
    Beiträge
    17
    So,
    habs nochmal mit :

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

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

    Code :
    1
    2
    
    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 :
    1
    
    java -classpath .;{$libs} -jar jTestTool.jar -v

    Als Anhang mal beide Programme...
    Danke im Vorraus
    Angehängte Dateien Angehängte Dateien
     

  11. #11
    _jsd_ Tutorials.de Gastzugang
    hi,

    windows
    Code :
    1
    
    java -classpath .;[pfad zu deinem projekt] -jar jTestTool.jar -v

    linux
    Code :
    1
    
    java -classpath .:[pfad zu deinem projekt] -jar jTestTool.jar -v

    ich schau mir deinen code mal an...
     

  12. #12
    _jsd_ Tutorials.de Gastzugang
    hmm, also bei mir funktioniert alles anstandts los....

    aber als kleinen tip, klassen namen werden bei java groß geschrieben und das default package sollte man nicht verwenden...

    schau nochmal richtig das die firewall aus ist, die policies passen und die rechner erreichbar sind...

    hmf
     

  13. #13
    zerrome zerrome ist offline Mitglied
    Registriert seit
    Nov 2007
    Ort
    Köln
    Beiträge
    17
    Hi,
    Verdammt !! Sowas hab ich mir gedacht,die linux Rechner haben irgendwie ein Problem... aber echt seltsam, weil Netzwerkdrucken über cups geht , nfs Freigaben gehn nur nix rmi, na ja auf jeden fall mal vielen Dank für die Mühe... ist dann wohl ein Netzwerk Problem...
     

  14. #14
    _jsd_ Tutorials.de Gastzugang
    hi,

    hat mit linux nicht wirklich was zu tun, habe debian

    gruß
     

  15. #15
    zerrome zerrome ist offline Mitglied
    Registriert seit
    Nov 2007
    Ort
    Köln
    Beiträge
    17
    So,
    lag dann echt irgendwie am Netzwerk...

    Habe jetzt RMI mit Custom RMIServerSocketFactory am laufen, im Netzwerk!!
    Ist ganz ok, weil man die Ports bestimmen und auf die Sockets einfluss nehmen kann...
    Ist auch nicht so viel mehr Aufwand, aber kennt jemand spezielle Nachteile zufällig
    Na ja bin erstmal froh das es läuft...
    Danke nochmal.
    Ich stehe auch gern für Fragen bereit...

    Grüße Zerrome
     

Ähnliche Themen

  1. TCPListener Probleme im Netzwerk, aber lokal geht
    Von Vlami im Forum .NET Web und Kommunikation
    Antworten: 7
    Letzter Beitrag: 18.03.10, 10:36
  2. Antworten: 9
    Letzter Beitrag: 13.07.07, 13:30
  3. Antworten: 1
    Letzter Beitrag: 12.02.07, 21:30
  4. Netzwerk über DSL-Router funktioniert nicht
    Von andi73 im Forum Netzwerke
    Antworten: 8
    Letzter Beitrag: 29.10.04, 16:57
  5. Internetfreigabe über Netzwerk,Client zeigt einige Webseiten nicht an
    Von Spartakusss im Forum Internet, DSL & Flatrate
    Antworten: 4
    Letzter Beitrag: 24.01.04, 22:54