# rmic/rmiregistry rauben mir den letzten nerv!



## Deception (20. Jan 2006)

Hey Leute,
Ich habe die ganze Zeit mit Sockets gearbeitet, fand nun aber, dass RMI doch eigentlich viel schöner ist! So habe ich mich dann durch dieses Forum und durch ein weiteres Forum gelesen und auch was zu stande gebracht! Nun hab ich allerdings noch das Problem das es absolut alles nicht so wirklich läuft )c: 
Rmic sollte ja 2 neue Klassen erstellen oder?! Ein Skelleton und eine Stub Klasse?! Bei mir erstellt er nur ein Stub! 
rmiregistry lässt sich starten, jedoch sagt er mir immer das der Standard Port (1099?) belegt sei und ich starte es daher mit rmiregistry 200 und versuche dann natürlich auch auf diesem zu connecten! Jedoch wirft er mir folgende Fehlermeldung:

java.rmi.ConnectException: Connection refused to host: 192.168.0.2; nested exception is: 
	java.net.ConnectException: Connection refused: connect

Ich habe an diesem Problem schon Stunden zugebracht, fast alle Beiträge die ich hier zu RMI gefunden habe gelesen und auch halt in dem anderen Forum, doch ich bekomms einfach nicht hin :|
Ich werde bestimmt etwas in der Classpath falsch haben oder in dem Aufruf der rmiregistry oder in der Art wie ichs compilier, deswegen leg ich jetzt noch ein paar Sachen auf den Tisch, die Antworten erleichtern könnten:

Die JDK liegt auf: E:\Programme\Java\jdk1.5.0_05\
rmi/rmiregistry daher in: E:\Programme\Java\jdk1.5.0_05\bin
Ich benutze Windows 2000.
Das Eclipse Projekt liegt auf:
F:\JAVA\Server\Server
Die RMI Dateien liegen in:
F:\JAVA\Server\Server\serv\net\rmi
Die Implementation liegt in:
F:\JAVA\Server\Server\serv\net\rmi\impl

Meine bisherige Classpath: (ein bisschen wüst, ich hab rumprobiert )
F:\JAVA\Server\Server\serv\net\rmi\impl;F:\JAVA\Server\Server

Compilieren tu ich mit Eclipse und benutze wie oben ersichtlich das JDK 1.5.0_05 

Bitte kommt mir jetzt nicht mit suchen, denn das habe ich schon alles durch und Java ist auch eine Insel so wie mein Herdt Buch hat mich auch nicht weitergebracht!
Bin dankbar für jede Hilfe  
mfg,
Jens


----------



## Deception (22. Jan 2006)

Huhu, 
jetzt bin ich schon ein wenig weiter gekommen! Mein "Server" startet nun und mein Client scheint auch den Server zu finden, jedoch wirft er dann eine NotBoundException. Nun poste ich mal ein wenig Code:

zum Server Starten:

```
public class ServerStart
{
	public void runRMI() throws RemoteException
	{
		try
		{
			String codebase = "file:/F:\\JAVA\\Spiel_Server\\SpieleServer\\serv\\net\\rmi\\impl";
			System.setProperty("java.rmi.server.codebase", codebase); 
			Registry registry = LocateRegistry.getRegistry("192.168.0.2");
			MyRemoteInterface implementation = new RemoteImplementation();
			registry.rebind( "http://localhost/rmiMethods", new RemoteImplementation() );
		}
		catch(RemoteException e)
		{
			System.out.println(e);
		}
	}
}
```

Das Interface:


```
public interface MyRemoteInterface extends Remote
{
	boolean login(String user, String password) throws RemoteException;
	int registrieren(String user, String password) throws RemoteException;
	
	Vector holeKlassen() throws RemoteException;
}
```

Meine Implementation:

```
public class RemoteImplementation extends UnicastRemoteObject implements MyRemoteInterface
{
	final static long serialVersionUID =1;
	
	public RemoteImplementation() throws RemoteException
	{
		super();
	}
	
	public boolean login(String user, String password) throws RemoteException
	{
		
		return true;
	}
	
	public int registrieren(String user, String password) throws RemoteException
	{
		return 1;
	}
	
	public Vector holeKlassen() throws RemoteException
	{
		readCharacters characters = new readCharacters();
		return characters.characters();
	}
}
```

und zu guter letzt mein Client:

```
Registry registry = LocateRegistry.getRegistry("localhost",1099);
MyRemoteInterface rmiMethoden = (MyRemoteInterface) registry.lookup("rmiMethods");
klassen = rmiMethoden.holeKlassen();
```

Die Stub-Klasse der Implementation liegt im gleichen ordner wie das Interface und auch noch einmal im unterordner impl, da ich dachte, dass es vlt da liegen müsste wo die "normale" Implementation auch auf dem Server liegt. 
Hat jemand eine Idee wieso ich nun, wenn ich den Clienten ausführen lasse folgende Exception: 
java.rmi.NotBoundException: rmiMethods
bekomme? :|
mfg,
Jens


----------



## Guest (23. Jan 2006)

registry.rebind( "rmiMethods", new RemoteImplementation());


Was soll das mit dem http://localhost/rmiMethods überhaupt?  :autsch:


----------



## Deception (24. Jan 2006)

Hey,
Cool, Danke  Jetzt komm ich schonmal zum nöchsten fehler  

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.lang.ClassNotFoundException: serv.net.rmi.MyRemoteInterface
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at client.gui.held.HeldenErstellen.heldenErstellen(HeldenErstellen.java:78)
	at client.Listener.Helden$1.actionPerformed(Helden.java:18)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.Dialog$1.run(Unknown Source)
	at java.awt.Dialog.show(Unknown Source)
	at java.awt.Component.show(Unknown Source)
	at java.awt.Component.setVisible(Unknown Source)
	at client.gui.HeldenDialog.<init>(HeldenDialog.java:18)
	at client.Listener.FrameActionListeners$4.actionPerformed(FrameActionListeners.java:42)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.AbstractButton.doClick(Unknown Source)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: serv.net.rmi.MyRemoteInterface
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Unknown Source)
	at sun.rmi.server.LoaderHandler.loadProxyInterfaces(Unknown Source)
	at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source)
	at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source)
	at java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown Source)
	at java.rmi.server.RMIClassLoader.loadProxyClass(Unknown Source)
	at sun.rmi.server.MarshalInputStream.resolveProxyClass(Unknown Source)
	at java.ibjectInputStream.readProxyDesc(Unknown Source)
	at java.ibjectInputStream.readClassDesc(Unknown Source)
	at java.ibjectInputStream.readOrdinaryObject(Unknown Source)
	at java.ibjectInputStream.readObject0(Unknown Source)
	at java.ibjectInputStream.readObject(Unknown Source)
	... 57 more

Dies spuckt der client aus! Das komische ist das er das package des Servers sucht, also wird es schonmal nicht am clienten liegen :|
-> serv.net.rmi.* ist Server package...
Wiedermal keine Ahnung was ich zu tun hab :|
Wäre für Hilfe wieder dankbar *g*
Tschö,
Jens


----------



## Guest (24. Jan 2006)

Die Fehlermeldung ist eindeutig oder? 

...
java.lang.*ClassNotFound*Exception: *serv.net.rmi.MyRemoteInterface*

serv.net.rmi.MyRemoteInterface muss im Classpath des Clients 
stehen, da du es dort auch verwendest.

Langsam aber sicher wird es was.


----------



## Deception (24. Jan 2006)

Huhu du mysteriöser Gast  

Wie bekomme ich die denn in den Classpath des Clienten?
Das Interface liegt ja auch in einem Ordner des Clienten und wird importiert und auch entsprechend gecastet
(MyRemoteInterface rmiMethoden = (MyRemoteInterface) registry.lookup("rmiMethods")
Was muss ich noch tun, damit er es nimmt? *verzweifel*

Vielen Dank schonmal,
Jens


----------



## Guest (24. Jan 2006)

Ist es auch im richtigen Verzeichnis?

serv/net/rmi/MyRemoteInterface.class

Mach mal zum Test im Client folgendes
	
	
	
	





```
try
{
  Class.forName("serv.net.rmi.MyRemoteInterface");
}
catch(Exception e)
{
  e.printStackTrace();
}
```
Wenn dies eine FileNotFoundException produziert, dann ist es garantiert nicht in Classpath.


----------



## Deception (25. Jan 2006)

WOW! Es hätte mal in irgendeinem Tutorial stehen sollen, dass das Interface im gleichen Package wie auf dem Server liegen muss! Oh man, hab ich daran viel Zeit verschwendet! 
Vielen, vielen Dank lieber Gast  

mfg, 
Jens


----------



## Deception (25. Jan 2006)

Hey,
Muss dieses Thema wohl leider noch einmal neu aufwickeln *sfz* 
Ich habe mir gedacht, nachdem ich es geschafft hatte dies zum laufen zu bringen, dass der ganze Code für die Tonne ist (Style mäßig und weil ich seit ich angefangen hatte auch viel dazugelernt habe).
Also hab ich wieder mein Interface geschrieben, meine Implementation usw. 
Doch diesmal kommt es beim Server zu Problemen :|
Alles was wir in diesem Thread behandelt haben, hab ich auch schon gecheckt:
-Classpath 
-richtiger Ordner
-package Struktur
:/
Ok nun zum Problem:
Es ist wieder eine ClassNotFoundException...
package hierarchie:
server
server.gui
server.gui.listener
server.rmi
server.rmi.impl

vom listener aus wird ServerStarten in server.rmi aufgerufen! 
Das Interface liegt in server.rmi, sowie in server.rmi.impl
Implementation liegt (logischerweiße  ) in server.rmi.impl

Doch er sagt mir er kann die InterDatenbank.class in package  server.rmi nicht finden. 
Aber auch wenn ichs dort hin kopiere funktioniert es nicht! 
Classpath ist mit Class.forName(); ausprobiert worden, er wirft keine Exception! 
hier wiedermal der Code:


```
//Implementation
package server.rmi.impl;

import server.rmi.InterDatenbank;

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

public class ImplementationDatenbank extends UnicastRemoteObject implements InterDatenbank
{
	static final long serialVersionUID = 1;
	public ImplementationDatenbank() throws RemoteException
	{
		super();		
	}
	public void leseCharakter() throws RemoteException
	{
		
	}
}

//Interface
package server.rmi;

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

public interface InterDatenbank extends Remote
{
	public void leseCharakter() throws RemoteException;
}

//Starten des Servers

import server.rmi.impl.ImplementationDatenbank;
import server.rmi.InterDatenbank;

public class ServerStarten
{
	public void runRMI() throws ClassNotFoundException
	{
		try
		{
			ImplementationDatenbank datenbank = new ImplementationDatenbank();
			UnicastRemoteObject.unexportObject(datenbank,false);
			InterDatenbank datenbank1 = (InterDatenbank)UnicastRemoteObject.exportObject(datenbank,0);
			RemoteServer.setLog(System.out);
			Registry registry = LocateRegistry.getRegistry("192.168.0.2");
			registry.rebind("datenbank",datenbank1);
			System.out.println("Datenbanken Methoden angemeldet");
		}
		catch(RemoteException e)
		{
			System.out.println(e.getLocalizedMessage());
			
		}
	}
}
```

Tja, irgendwie schein ich zu blöd dafür zu sein :/ 
Kann mal wieder nur auf eure/Gasts Hilfe hoffen *g* 
Gute nacht,
Jens


----------



## Guest (26. Jan 2006)

Wie lautet die Exception genau? Da Du es auch normal instanzierst 
(nicht über Reflexion etc.) sollte es normal gefunden werden.  ???:L


----------



## Deception (26. Jan 2006)

Hey,
Wollte grade den Fehler kopieren und siehe da, es geht?! 
Kann es sein, dass wenn man die Classpath ändert man erstmal neu starten muss? DAS hab ich nämlich nicht gemacht *g* Wäre mir jetzt die einzige Erklärung :| 

Trotzdem Danke fürs drüber schauen 
mfg,
Jens


----------



## Guest (26. Jan 2006)

Deception hat gesagt.:
			
		

> ...
> Kann es sein, dass wenn man die Classpath ändert man erstmal neu starten muss? DAS hab ich nämlich nicht gemacht *g* Wäre mir jetzt die einzige Erklärung :|
> ...


Yepp. Das ist es gewesen.


----------



## Deception (26. Jan 2006)

Ok, dann weiß ich das für die Zukunft... Nochmals vielen Dank *abhak*


----------

