# RMI - Call-By-Object-Reference?



## jLn (26. Nov 2007)

Hallo, folgendes Problem:

Ich habe eine Client/Server Applikation geschrieben die über RMI kommuniziert und soweit auch funktioniert!
Es gibt zwei Methoden "searchUser()" und "getAllUsers()", die ein User-Objekt bzw. einen Vector<User>
zurückgeben. 

Nun musste ich das Interface Serializable für die Klasse User implementieren, damit es übertragbar ist!
Jetzt habe ich erfahren, dass eine Kopie an den Client zurückgegeben wird und das Objekt soll aber nur auf
dem Server existieren!

Man hat mir gesagt, dass die Klasse User ein eigenes Interface implementieren muss, aber irgendwie verstehe
ich nicht wie das aussehen soll?

Kann mir da jemand behilflich sein, also wie man nicht eine Kopie, sondern eine Referenz an den Client übergibt?

Danke schon mal im Vorraus!


----------



## Niki (26. Nov 2007)

Wie soll das funktionieren? Du kannst nicht dem Client eine Referenz vom Objekt des Servers geben. Du bekommst immer ein eigenes Objekt. Das einzige was du machen kannst ist, dem Client einen Stub (also wieder ein Remote Objekt) übergeben. Rufst du dann am Client eine Methode des Objektes auf, wird die Methode in wirklichkeit wieder am Server aufgerufen. Dein User Objekt müsste also von UnicastRemoteObject ableiten (oder du exportierst es selber) und ein Remote-Interface implementieren


----------



## Angel4585 (26. Nov 2007)

du hast ein UserInterface:

public interface UserInterface

und eine Klasse User:

public class User implements UserInterface

jetzt kannst du anstatt "User" zu übergeben, "UserInterface" übergeben, und einfach due Methoden die du in "UserInterface" definiert hast aufrufen


----------



## Niki (26. Nov 2007)

Ich glaube nicht das er das gemeint hat. Du bekommst ja trotzdem eine Kopie der Objekte, nur implementieren diese halt ein Interface. So sollte es klappen:

```
public class UserImpl extends UnicastRemoteObject implements User{

  private String name = null;

  public UserImpl() throws RemoteException{

  }

  public void setName(String name) throws RemoteException{
    this.name = name;
  }

  public String getName() throws RemoteException{
    return this.name;
  }
}

public interface User extends Remote{

  public void setName(String name) throws RemoteException;
  public String getName() throws RemoteException;

}
```

So schickt der Server dem Client Stubs runter, auf diesen Stubs kannst du Methoden aufrufen, die jedoch am Server ausgeführt werden. Ist das gewünscht?


----------



## jLn (26. Nov 2007)

danke niki! so funktioniert das ganz gut und ich glaube auch so in der Art solls auch sein!


----------

