# Frage/Problem mit RMI



## nussi (3. Jun 2009)

Hallo,
ich versuche mir gerade selbst RMI beizubringen. Allerdings scheitere ich jedes mal daran, den Server zum laufen zu bringen. Zum Testen benutze ich folgenden Code:

HelloClient:

```
package qpackage;

import java.rmi.Naming;

public class HelloClient {

  public static void main(String args[]) {
    try {
      HelloServer server = (HelloServer)Naming.lookup("hello-server");
      String result = server.sayHello();
      System.out.println(result);
    } catch(Exception ex) {
      ex.printStackTrace();
    }
  }

}
```

HelloServer:

```
package qpackage;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface HelloServer extends Remote {

  public String sayHello() throws RemoteException;

}
```

und HelloImpl


```
package qpackage;

import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
import java.rmi.Naming;

import qpackage.HelloServer;

public class HelloImpl extends UnicastRemoteObject implements HelloServer {

  public HelloImpl() throws RemoteException {
  }

  public String sayHello() {
    return "Hello World";
  }

  public static void main(String args[]) {
    try {
      Naming.rebind("hello-server", new HelloImpl());
    } catch(Exception ex) {
      ex.printStackTrace();
    }
  }
  
}
```

Wenn ich jetzt meinen Server ausführe bekomme ich folgende Fehlermeldung:
java.rmi.ConnectException: Connection refused to host: localhost; nested exception is: ...
Kann mir jemand sagen wo mein Fehler liegt?


----------



## tfa (3. Jun 2009)

Versuch's mit nem richtigen URL: "rmi://127.0.0.1/hello-server".

http://www.java-forum.org/blogs/tfa/12-snippet-remote-methode-invocation-minimal.html


----------



## nussi (4. Jun 2009)

Danke klappt jetzt genau so wie ich es mir vorgestellt habe. Allerdings stehe ich jetzt vor meinem nächsten Problem: Und zwar habe ich auf meinem Server eine Datenbank mit Büchern liegen. Diese will ich nach einem bestimmten Buchtitel durchsuchen. Das gefundene Buch soll an den Client als Objekt zurückgeschickt werden. Hier meine bisherigen Methoden:

auf dem Server:

```
public Buch sucheBuch(String buchname) throws RemoteException {
		Buch gefundenesBuch = null;
		try {
			gefundenesBuch = Read.getBuecher(input);
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		
		return gefundenesBuch;
	}
```

und der Methodenaufruf durch den Client:

```
Buch myBook = service.sucheBuch("Der Schwarm");
```

Wenn ich die Anfrage so auf dem Client ausführe bekomme ich eine java.rmi.UnmarshalException um die Ohren gehauen. Nehme ich als Rückgabewert statt dem Objekt Buch einen String (z.B. Buchtitel) klappt alles einwandfrei. Liegt es daran, dass ich gar nicht ohne weiteres eigene Objekte vom Server zum Client schicken kann?


----------



## ck2003 (4. Jun 2009)

Standardmässig sind die nicht serialisierbar. Ein "implements Serializable" in deiner Klasse Buch sollte Abhilfe schaffen.


----------

