# RMI mit HashMap



## Dynamaik (5. Mai 2011)

Hi.

Ich steh gerade bei meinem Programm etwas auf dem Schlauch, oder besser gesagt ich weiß nicht wie ich die HashMap in meinem Programm sinnvoll nutzen kann.

Ich zeig am besten erstmal mein(e) Programm(e). Es handelt sich dabei um ein Bankprogramm. 

Zuerst der Server:


```
package de.edu.hbrs.rmi.server;

import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.RemoteServer;
import java.rmi.server.UnicastRemoteObject;

import de.edu.hbrs.rmi.IBank;
import de.edu.hbrs.rmi.IKunde;
import de.edu.hbrs.rmi.client.BankProgramm;

public class Server {

	public static void main(String[] args) throws RemoteException {
		
		Registry reg = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
		
		IBank stub = (IBank) UnicastRemoteObject.exportObject( 
				new BankProgramm(), 0);
		
		IKunde stub1 = (IKunde) UnicastRemoteObject.exportObject(
				new BankProgramm(), 0);
		
		
		reg.rebind("IBank", stub);
		reg.rebind("IKunde", stub1);
		
		System.out.println(reg);
		
		RemoteServer.setLog(System.out);
		
	}
}
```


Das Programm für den Vorstand der Bank:


```
ackage de.edu.hbrs.rmi.client;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import de.edu.hbrs.rmi.IBank;

public class VorstandProgramm  {

	public static void main(String[] args) throws RemoteException, NotBoundException {
	
	Registry reg = LocateRegistry.getRegistry("127.0.0.1",
			Registry.REGISTRY_PORT);
	
	IBank bank = (IBank) reg.lookup("IBank");
	

	
}
	
}
```

Das Progamm für den Kunden:


```
package de.edu.hbrs.rmi.client;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import de.edu.hbrs.rmi.IKunde;

public class KundenProgramm {

	public static void main(String[] args) throws RemoteException, NotBoundException {
		
	Registry reg = LocateRegistry.getRegistry("127.0.1.1",
			Registry.REGISTRY_PORT);
	
	IKunde kunde = (IKunde) reg.lookup("IKunde");
	

	kunde.getKontostand(1);

	    	
	}
}
```


Das Programm der Bank:


```
package de.edu.hbrs.rmi.client;

import java.rmi.RemoteException;
import java.util.HashMap;
import java.util.Map;

import de.edu.hbrs.rmi.IBank;
import de.edu.hbrs.rmi.IKunde;

public class BankProgramm implements IBank, IKunde {

	double betrag;
	Integer kontoNr = 0;
	String name;
	
	HashMap<String, Integer> konten = new HashMap<String, Integer>();	

	
	@Override
	public double getKontostand(int kontoNr) throws RemoteException {
		if  (konten.get(name) != null) {
		System.out.println("Ihr Kontostand beträgt:" + betrag);
		}
		return betrag;
	
	}
	

	@Override
	public double einzahlen(double betrag, int kontoNr) throws RemoteException {
		if (konten.get(name) != null)  {
			System.out.println("Betrag wird verbucht.");
			this.betrag += betrag;
		} else System.out.println("Konto existiert nicht");
		return betrag;
	}

	@Override
	public double auszahlen(double betrag, int kontoNr) throws RemoteException {
		this.betrag -= betrag;
		return betrag;
	}

	@Override
	public void keinrichten(String name) throws RemoteException {
		if (konten.get(name) != null) { 
			System.out.println("Das Konto existiert bereits!");
		} else {
			kontoNr += 1;
			konten.put(name, kontoNr);
			System.out.println(name + kontoNr);
			
		}
				
		
	}

	@Override
	public void klöschen(int kontoNr) throws RemoteException {
			konten.remove(kontoNr);
			

		
	}


	@Override
	public void getKonten() throws RemoteException {
		System.out.println(konten.containsValue(kontoNr));
		
	}
```


Und die dazugehörigen Interfaces: 



```
package de.edu.hbrs.rmi;

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

public interface IBank extends Remote {
	
	public void keinrichten(String name) 
	throws RemoteException;
	
	
	public void klöschen(int kontoNr) 
	throws RemoteException;
	
	
	public void getKonten()
	throws RemoteException;

}
```



```
package de.edu.hbrs.rmi;

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

public interface IKunde extends Remote {
	
	
	public double getKontostand(int kontoNr) 
	throws RemoteException;
	
	
	public double einzahlen(double betrag, int kontoNr) 
	throws RemoteException;
	
	
	public double auszahlen(double betrag, int kontoNr)
	throws RemoteException;
	
	

}
```


Der Server läuft auf localhost und er funktioniert. Wenn ich das Programm des Vorstandes starte und ein Konto mit

```
bank.keinrichten("xyz");
```
einrichte dann funktioniert dies auch. 

Wenn ich jetzt im Programm des Kunden etwas auf ein Konto einzahlen will mit

```
kunde.einzahlen(500, 1);
```
dann funktioniert das schon nicht mehr. 

Ich schätze mal das Problem ist das ich nicht weiß wie ich beim Methodenaufruf dem richtigen Namen die richtige Kontonummer zuweisen kann. Immer wenn ich die Methode zum Einzahlen auf ein Konto aufrufe wird direkt "Das Konto existiert nicht" ausgegeben. Es muss doch irgendwie möglich sein eine Verbindung zwischen der Kontonummer, die ich als Parameter übergebe und den Key "name" herzustellen.

Soweit ich das mit HashMap verstanden habe ist das der erste Typ in der HashMap der Key und der zweite Typ eben Value ist. So in etwa 
	
	
	
	





```
HashMap<Key, Value> konten = new HashMap<Key, Value>();
```



Gruß,
Dynamaik


----------



## SlaterB (5. Mai 2011)

Zeile 12-14 im Bankprogramm solltest du als aller erstes entfernen,
Klassenattribute brauchst du für sowas nicht, das kann in jeder Methode lokal gemacht werden 

wenn auf ein bestimmtes Konto mit einem gewissen Namen etwas einzahlen willst, dann brauchst du offensichtlich einen Paramter String name und der Aufrufer muss den Namen angeben, z.B.
kunde.einzahlen("zyz", 500, 1); für Konto "xyz", nicht so kompliziert oder?

ok, du hast selber bisschen Komplexität reingebracht indem es noch die Kontonummern gibt,
die Map hat String name als Key, da muss du die Werte wohl einzeln der Reihe nach durchsuchen,

allerdings speicherst du in der Map eh nur den Namen und die Kontonummer, wo soll der Betrag hin?
deshalb also das Klassenattribut, aber wenn du für zwei Konten unterschiedliche Beträge speichern willst?
meine Güte, die einfachsten Grundlagen,

auf RMI usw. solltest du erstmal verzichten, schreibe ein einfaches lokales Programm auch ohne Vorstand und Kunden,
die main-Methode legt drei Konten an, zahlt in jedes einen Betrag und gibt am Ende alle drei Konten mit Betrag aus,
wenn das geschafft wäre, wärst du viel weiter als 100fach kompliziertere komische Registrys und IBank-Interface herumzuschaukeln

eine HashMap<String, Konto> mit neuer Konto-Klasse könnte dabei helfen,
wenn möglich zu Beginn auch NUR mit Namen oder NUR mit Kontonummern arbeiten,


----------



## Dynamaik (5. Mai 2011)

SlaterB hat gesagt.:


> Zeile 12-14 im Bankprogramm solltest du als aller erstes entfernen,
> Klassenattribute brauchst du für sowas nicht, das kann in jeder Methode lokal gemacht werden
> 
> wenn auf ein bestimmtes Konto mit einem gewissen Namen etwas einzahlen willst, dann brauchst du offensichtlich einen Paramter String name und der Aufrufer muss den Namen angeben, z.B.
> kunde.einzahlen("zyz", 500, 1); für Konto "xyz", nicht so kompliziert oder?



Nein das ist nicht kompliziert. Vielleicht hätte ich das vorher schreiben sollen. Eine Einzahlung darf nur über die Kontonummer erfolgen. 



> allerdings speicherst du in der Map eh nur den Namen und die Kontonummer, wo soll der Betrag hin?
> deshalb also das Klassenattribut, aber wenn du für zwei Konten unterschiedliche Beträge speichern willst?
> meine Güte, die einfachsten Grundlagen,



Stimmt. Ein Konto würde auch schon genügen. Es hat mir niemand gesagt das ich HashMap verwenden soll, dass kam eher von mir. Ohne die HashMap wüsste ich nicht wie ich ein Konto löschen sollte, außer alles 0, null zu setzen.



> eine HashMap<String, Konto> mit neuer Konto-Klasse könnte dabei helfen,
> wenn möglich zu Beginn auch NUR mit Namen oder NUR mit Kontonummern arbeiten,



[/QUOTE]

Ich brauche ja den Namen um eine Kontonummer zu erstellen. Ich werde den String aus der HashMap entfernen und diesen mit  der Kontonummer ersetzen und anstelle der Kontonummer werde ich den Betrag einsetzen. 
So wäre ja dann die Kontonummer mein Key und der Betrag mein Value. 

Erstmal danke für die Hilfe.


Gruß,
Dynamaik


----------

