# Rückwertige RMI Kommunikation



## Raidri (22. Jan 2009)

Hi Leute,

Ich habe folgendes Problem.

Ich habe eine Client / Server Architektur, wo sich mehere Clients auf einem Server anmelden können. Wird der Client gestartet, wird er selber ein temporärer Server, der so lange da sein soll bis der Client seine Applikation schließt, das wurde gemacht da der Server Meldungen zum Client schicken muss die nicht über einen return wert gehen, d.h. der Client muss für diesen zeitpunkt als Server fungieren. Mit dem anmelden auf dem Server schickt jeder Client seine IP via methodenaufruf mit in dem fall 

xy.uebergebeClientIp(String ip);

in Dieser Methode wird dann direkt ein Naming.lookup auf den Client gemacht mit


```
public void uebergebeClientip(String ip)
{
     v = (IVerteilung) Naming.lookup("rmi://"+ip+":7777/verteilung");
}
```

Folgendes Problem.. ich war bis dato in dem aberglauben das RMI irgendwie so ne art "Threading" beinhaltet und es niemals probleme mit der methode oben geben kann. nur wenn sich mehr als 1 Person beim server anmeldet bekommt immer der letzt angemeldete User die Nachrichten die normalerweise garnicht für ihn bestimmt waren, sondern für einen User der sich viel früher angemeldet hat. D.h. er bildet sich immer nen neues Objekt "v" und überschreibt das alte. Wie bekomme ich es nun hin das er dies nicht tut, sodass jede Nachricht den User erreicht den es auch erreichen sollte.

Sry das der Code mit hand reingeschrieben wurde aber habe die Daten nicht auf dem System hier und musste es deswegen so schreiben. Hoffe man kann mir in dem Sinne vllt trotzdem weiterhelfen.

Danke

lg,
Raidri


----------



## tuxedo (22. Jan 2009)

Es ist doch quatsch am Client nochmal nen RMI Server zu starten.

Schonmal was von Callbacks gehört? Da gibst du dem Server in einem Methodenaufruf einfach ein Objekt mit, das du zuvor mit RMI exportiert hast (oder du lässt es von UnicastRemoteObject erben) und gut ist.

Ruft der Server nun Methoden an diesem Objekt auf, wird der Aufruf zum Client geführt.

Wenn das ganze über's Internet laufen soll und du nicht zwingend auf RMI festgelegt bist, schau dir doch mal SIMON an.

Andernfalls rate ich dir mal nach "RMI" und "Callback" zu googeln.

- Alex


----------



## Marco13 (22. Jan 2009)

tuxedo hat gesagt.:
			
		

> Es ist doch quatsch am Client nochmal nen RMI Server zu starten.



Vorneweg: Ich habe (speziell im Vergleich zu demjenigen, der SIMON geschrieben hat) wirklich NULL Ahnung von diesen Client/Server-Netzwerk-Geschichten - aber ... so eine drastische Aussage irritiert mich, weil ich zumindest weiß, dass zwischen den beiden immer eine Firewall stehen kann, und man da manchmal .... rumdengeln  :? muss.


----------



## Gast2 (22. Jan 2009)

Moin,



			
				Marco13 hat gesagt.:
			
		

> Ich habe [...] wirklich NULL Ahnung von diesen Client/Server-Netzwerk-Geschichten



ist alles eine Ansichtssache

*ein Server*

zumindest ungefähr ... habe unter Java noch kein Netzwerk gemacht


```
Socket socket = new Socket(myIP, myPort)
Socket.Bind()
while(!ende) New ServerClient(socket.acceptClient());
```

mehr macht ein Server nicht (wie gesagt eine Ansichtssache!) ... und dann kannst Du unterscheiden zwischen Server-Client und Client-Client

*Server-Client*

```
public ServerClient implements Runnable
{
    public ServerClient(Socket socket)
    {
        // der ganze Kram auf Server-Seite
    }
}
```

*Client-Client*

```
public ClientClient implements Runnable
{
    public ClientClient(Socket socket)
    {
        // der ganze Kram auf Client-Seite
    }
}
```

gut - die sehen sich jetzt ähnlich ... ist aber so gewollt, denn so unterscheide ich im Netzwerk

hand, mogel


----------



## tuxedo (23. Jan 2009)

Meine "quatsch" aussage bezieht sich darauf, dass ein RMI Server auf Clientseite nicht notwendig ist nur um dem Server zu ermöglichen Methoden am Client aufzurufen. Das macht man mit Callbacks. 

Aber okay, im Falle von "ich kann/darf nur RMI verwenden" und "der Client sitzt hinter einer Firewall/Router" ist es vermutklich wirklich einfacher auf dem Client nochmal einen RMI Server zu instanziieren, als sich mit den anonymen Serverports die RMI bei der vernwendung von Callbacks aufmacht umzugehen.

Gruß
Alex


----------



## Raidri (23. Jan 2009)

ja thx, das mit dem callback war ne lücke in meinem wissen. mit dem hat das alles super funktioniert . herzlichen dank. und es ist wirklich quatsch sowas zu machen nur wusste ich bis dato keinen besseren ausweg .

thx nochmal.


----------



## tuxedo (24. Jan 2009)

Wie gesagt. Wenn der Client hinter einer Firewall/einem Router sitzt, macht dein ursprüngliches Vorhaben durchaus Sinn. In allen anderen Fällen wohl eher nicht.

- Alex


----------

