# Klassen über Netzwerk kommunizieren lassen



## guestUser (27. Okt 2012)

Hallo,

Ich hab zwei Klassen A und B auf zwei verschiedenen Rechnern (Adressen sind zur Laufzeit bekannt). Wie kann ich sie miteinander kommunizieren lassen? Zum Beispiel dass A eine Methode von B aufruft. Ist das überhaupt möglich?

Viele Grüße.


----------



## xehpuk (27. Okt 2012)

Ja, der Begriff dafür lautet Remote Procedure Call.
Implementationen dafür in Java sind bspw. Remote Method Invocation und SIMON.


----------



## guestUser (27. Okt 2012)

Danke


----------



## Torte (18. Nov 2012)

Hallo,
ich habe dazu eine Frage.

Ist es auch gängie Art mittels RMI eine Client/Sever-Anwendung zu entwickeln, um auf eine Datenbank zuzugreifen, die auf einen Server liegt?

Was meine ich damit:
Wenn ich eine Datenbank irgendwo auf einem Server habe und direkt vom Client auf die Datenbank (bspw. MySQL) zugreifen will, muss ich ja im Client selbst das Passwort und den User hinterlegen, um die Verbindung zu bekommen. Mittels Decompilierung des Java-Codes würde dann ja jeder das Passwort und den Nutzernamen sehen, was ja nicht der Sinn sein sollte.

Daher frage ich mich, wie das normalerweise gelöst/implementiert wird. 
Meine Gedanken gehen jetzt dahin, auf dem Server, neben der Datenbank, ein weiteres Java-Programm laufen zu lassen, welches die ganzen SQL-Befehle bereitstellt und auch die Connection zur Datenbank herstellt.
Und der Client, der irgendwo auf einem Rechner liegt, dann die Methoden des Server-Programms aufruft. Dadurch würde ich ja verhindern, dass das Passwort und der User bekannt werden, und dass nur die vorgegebenen SQL-Befehle des Server-Programms ausgeführt werden können.

Das RMI hört sich, was ich so gelesen habe, ja genau danach an. Dass ich dann die Methoden in dem Programm aufrufen kann und das so gelöst wird.


Meine Frage ist jetzt einfach, ob das in der Praxis auch so (mittels RMI) gelöst wird. Oder ob es da einen anderen Ansatz gibt, der besser, performanter oder was auch immer ist.  Ich wäre euch dankbar, wenn ihr mir weiterhelft 


Viele Dank schon mal für die Denkanstöße


----------



## träät (18. Nov 2012)

da RMI immer irgendwie objekt-referenzen und -instanzen verwendet ist es so auch möglich über reflections über RMI diese zu manipulieren ... und so doch wieder an die daten zu kommen (wie aufwändig das wäre weis ich nicht ... ist aber sicher möglich) ...

wenn es "vorgegebene" abfragen sein sollen würde sich sowas mit nem webservice realisieren lassen ... natürlich gehts auch mit ner eigenen anwendung ... dann würde ich aber kein RMI nutzen sondern normale sockets und darüber eigene parameter senden ...

RMI stellt halt durch mögliche Reflections ein großes sicherheitsrisiko dar


----------



## tuxedo (19. Nov 2012)

träät hat gesagt.:


> da RMI immer irgendwie objekt-referenzen und -instanzen verwendet ist es so auch möglich über reflections über RMI diese zu manipulieren ... und so doch wieder an die daten zu kommen (wie aufwändig das wäre weis ich nicht ... ist aber sicher möglich) ...
> 
> wenn es "vorgegebene" abfragen sein sollen würde sich sowas mit nem webservice realisieren lassen ... natürlich gehts auch mit ner eigenen anwendung ... dann würde ich aber kein RMI nutzen sondern normale sockets und darüber eigene parameter senden ...
> 
> RMI stellt halt durch mögliche Reflections ein großes sicherheitsrisiko dar



Sehe da kein allzugroßes Sicherheitsrisiko ...

Der RPC Client (ich sprech jetzt mal algemein für RMI und SIMON) hat in erster Linie ja nur (wenn mans richtig macht) eine Interface-Klasse. Darin sind exakt die Methoden aufgeführt, welche der CLient nutzen kann und darf. Keine mehr und keine weniger.

Der Client holt sich die Remote-Instanz in Form eines Proxys, welcher nach Anleitung der Interface-Klasse erstellt wird.
Selbst wenn du jetzt mit Reflection fit bist, kannst du da als Client nix ausrichten und Dinge manipulieren die du nicht manipulieren können solltest. Eben weil du das Objekt nicht tatsächlich in deiner VM hast, sondern nur ein Stellvertreter-Objekt, welches die Methoden der Interface-Klasse besitzt. Alle Methodenaufrufe werden dann über ein bestimmtes Protokoll in Byte-Pakete umgesetzt und über's Netzwerk zum Server geschickt. DER führt dann die Methode aus und liefert das Aufrufergebis wieder als Byte-Paket über's Netzwerk zurück an den Client. 

Sofern man also dem Client keine Implementierungsklasse gibt, und die Interfaces so wählt, dass der Client keine unnötigen Methoden erhält, dann kann da erstmal gar nix passieren.


----------



## Torte (20. Nov 2012)

Ok,
danke erstmal für eure beiden Antworten. 
Werde mir das mal anschauen.


----------

