# "invalid method hash" bei RMI Programm



## XesperantoX (16. November 2006)

Hallo,

ich bin dabei ein RMI Programm zu schreiben in welchem n-Monitore eine Datei mit CPU-Werten auslesen, diese dann in einem bestimmten Intervall an einen Coordinator geben und n-Clients sich die Werte beim Coordinator abholen können.
Soweit die Aufgaben, der Code ist auch mehr oder weniger fertig und der Coordinator läuft. Wenn ich aber einen Monitor starten will dann bekomme ich folgende Exception:


> java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
> java.rmi.UnmarshalException: invalid method hash
> at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:325)
> at sun.rmi.transport.Transport$1.run(Transport.java:153)
> ...


Der Fehler passiert beim Aufruf von folgender Zeile im Monitor.
	
	
	



```
frequence = miCoordinador.iniMonitor(objMonitor);
```
Ich konnte bisher herausfinden das anscheinend die Schnittstellen von Monitor und Coordinator nicht identisch sind. Leider finde ich aber nicht heraus warum sie das nicht sind...
Hier noch der Code vom Monitor und weiter unten die Implementierung des Coordinator Interfaces.

```
package monitor;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.StringTokenizer;

import coordinator.CoordinatorImpl;
import coordinator.CoordinatorInfz;

public class Monitor{

	private static String path = new String("C://JavaProg//loadavg.dat");
	
	
	public static void main( String args[]){
		try {
			MonitorInfz objMonitor = new MonitorImpl();
			int frequence = 1000;
			String tmp = "";
			double loadbalance = 0;
			CoordinatorInfz miCoordinador = null;
			
			try{
				System.out.println("Vor Try-Block");
				String registryURL = new String("rmi://localhost:2200/miCoordinador");
				miCoordinador = (CoordinatorInfz) Naming.lookup(registryURL);
				System.out.println("\n\nLookup ready, connect to server...");
				

				System.out.println("obj Monitor ist erzeugt...");
				frequence = miCoordinador.iniMonitor(objMonitor); //<--- Hier tritt Exception auf!
				System.out.println("Alles fertig...");
			} catch (IOException e) {
				e.printStackTrace();
			} catch (NotBoundException e) {
				e.printStackTrace();
			}
```


```
public synchronized int iniMonitor(MonitorInfz objMonitor) throws RemoteException {
		
		monitorVector.add(new DataManagement(objMonitor));		
		return frequenceMonitor;
	}
```

Danke,
Sascha


----------



## matdacat (16. November 2006)

Kann es sein, dass du auf Client- und Serverseite verschiedene Versionen einer Klasse verwendest? Also dass du vielleicht Änderungen an einer Klasse, die von Client und Server verwendet werden, z.B. nur auf der Clientseite gemacht hast und der Server somit eine andere Klasse mit selbem Namen verwendet? Du musst sicherstellen, dass die gemeinsam genutzen Klassen auf Client- und Serverseite absolut ident sind.


----------

