package javacodebook.net.rmi.objectcopy; /** * Address ist eine Klasse die sämtliche Adressdaten kapselt, * veränderbar sollen nur Strasse und Wohnort sein. * Da sie unter anderem übers Netz verschickt werden muss, muss * sie das Marker-Interface Serializable implementieren. */ public class Address implements java.io.Serializable { // Attribute der Klasse Address private String firstName; private String lastName; private String street; private String city; // Konstruktor der Klasse Address, sämtliche Attribute müssen // hier gesetzt werden public Address( String lastName, String firstName, String street, String city) { this.lastName=lastName; this.firstName=firstName; this.street=street; this.city=city; } public String toString() { return firstName+" "+lastName+"\n"+street+"\n"+city; } public void setStreet(String street) { this.street=street; } public void setCity(String city) { this.city=city; } } --- Neue Klasse --- package javacodebook.net.rmi.objectcopy; import java.rmi.*; /** * Dieses Interface definiert alle Methoden, die dem Client zugänglich * sein sollen. */ public interface AddressBook extends Remote{ // Unter diesem String soll der Dienst gefunden werden public final static String NAMING = "addressbook"; // Anzahl gespeicherter Adressen public int getSize() throws RemoteException; // Liefert Address Objekt zurück public Address getAddressByName(String name) throws RemoteException; } --- Neue Klasse --- package javacodebook.net.rmi.objectcopy; import java.rmi.*; import java.rmi.registry.*; /** * Dieser Client sucht ein entferntes Objekt im Netz, und ruft zwei seiner * Methoden auf. * Es können der Applikation beim Start zwei Strings übergeben werden, der * erste gibt den "Host" der zweite den "Port" des Namensdienstes an. */ public class AddressBookClient { public static String host = "localhost"; public static int port = 1099; public static void main(String[] args) throws Exception { // Werden zwei Strings beim Program-Start übergeben, wird der erste // als URL und der zweite als Port des Namensdienstes interpretiert. // Wird nichts übergeben werden Default-Einstellungen verwendet. if(args.length==2) { host=args[0]; port=Integer.parseInt(args[1]); } // Anhand der Namensdienst-URL und des Ports wird der LookupString // zusammengebaut. String mLookup = "//"+host+":"+port+"/"+AddressBook.NAMING; // Remote-Objekt wird referenziert, und zum AddressBook-Objekt // gecastet AddressBook book = (AddressBook)Naming.lookup(mLookup); // Aufruf der Methode getAddressByName("Arbeit") liefert ein // Objekt einer selbstgeschrieben Klasse Address a1= book.getAddressByName("Arbeit"); // Methoden des Remote-Objekts, sowie des übertragenen // Objects werden aufgerufen System.out.println("Das Adressbuch hat "+book.getSize()+" Eintraege."); System.out.println("Arbeit hat folgende Anschrift:\n" +a1.toString()+"\n"); // Werte des Objektes werden geändert und ausgegeben a1.setCity("Muenchen"); a1.setStreet("Landshuter Allee"); System.out.println("Arbeit hat geaenderte Anschrift:\n" +a1.toString()+"\n"); // Objekt wird neu abgefragt und ausgegeben. Da eine Kopie angelegt wurde, // sind Änderungen nicht mehr vorhanden. System.out.println("Adresse von Arbeit wird neu abgefragt..."); Address a2= book.getAddressByName("Arbeit"); System.out.println("Arbeit hat folgende Anschrift:\n" +a2.toString()+"\n"); } } --- Neue Klasse --- package javacodebook.net.rmi.objectcopy; import java.rmi.*; import java.rmi.registry.*; import java.rmi.server.UnicastRemoteObject; import java.net.MalformedURLException; import java.util.*; /** * Dieser Server beinhaltet AddressDaten. Kennt der Client den Nachname, * kann er auch weitere Informationen über diese Person erlangen. * Zusätzlich hat er noch Zugriff auf die Anzahl gespeicherter Adressen * Achtung: Bevor der Server laufen kann müssen Stub und Skeleton generiert * werden: * rmic javacodebook.net.rmi.objectcopy.AddressBookServer */ public class AddressBookServer implements AddressBook { // Adressen werden in eine HashTable abgelegt private Hashtable content = new Hashtable(); public int getSize() throws RemoteException { return content.size(); } public Address getAddressByName(String name) throws RemoteException { return (Address)content.get(name); } public AddressBookServer(int port)throws Exception { // AdressBuch wird mit Daten gefüllt fillHashTable(); // Die Registry wird vom Program aus gestartet LocateRegistry.createRegistry(port); // Dieses Server-Objekt wird exportiert UnicastRemoteObject.exportObject(this,port); // Das exportierte Objekt wird an der registry mit defnierter // URL angemeldet Naming.rebind("//localhost:"+port+"/"+AddressBook.NAMING, this); } /** * Füllt Adressbuch mit Daten. */ private void fillHashTable() { content.put("Arbeit", new Address("Arbeit", "Andi", "Terlindenweg","Soest")); content.put("Einstellbar", new Address("Einstellbar","Manuel","Kaiserallee","Karlsruhe")); content.put("Liebling", new Address("Liebling","Julia","Traumstrasse","München")); content.put("Mutig", new Address("Mutig","Miss","Kungshamra","Stockholm")); } // Server wird gestartet. public static void main(String[] args) throws Exception{ new AddressBookServer(1099); } }