Thomas Darimont
Erfahrenes Mitglied
Hallo!
Hier mal ein kleines Beispiel zu RMI unter Java 5.
Welche schicken Neuerungen es für RMI unter Java 5 gibt könnt ihr hier:
http://today.java.net/pub/a/today/2005/10/06/the-new-rmi.html
oder hier:
http://java.sun.com/j2se/1.5.0/docs/guide/rmi/relnotes.html
nachlesen.
In diesem Beispiel verwenden wir zur Laufzeit erzeugte Dynamic Proxies als Client-Stubs.
(D.h. wir werden keinen rmic Stub Compiler verwenden)
In meinem Rechner habe ich mehrere Netzwerkkarten. Da ich die rmiregistry jedoch
explizit an das Network Interface mit der IP 192.168.76.98 binde muss ich beim lookup
der Registry die entsprechende IP Addresse mitgeben.
Unser Service Interface:
Unsere Service Implementierung:
Unser Server:
Unser Client:
Der Client liegt in meinem Beispiel auf einem anderen Rechner. Auf Clientseite liegen nur die
Interfaces unseres Services (IRemoteService) vor, nicht jedoch die Implementierung.
(Man könnte den Client natürlich auch so konfigurieren, dass er sich die Interface Klassen selber
lädt:
Beispiel ... die Klassen liegen in einem Verzeichnis namens bin im htdocs Verzeichnis eines Apache Webservers.
Unser Aufruf der RMI Registry sieht dann so aus:
).
Auf dem Server starte ich die rmiregsirty mit folgendem Kommando:
Ich teile der rmiregistry also mit, wo sie unsere Service Interfaces finden kann und dass ich sie
explizit an das Network Interface mit der IP 192.168.76.98 binde.
Nun starten wir den Server über:
Anschließend starten wir den Client auf dem anderen Rechner:
Nun erhalten wir eine ähnliche Ausgabe:
Auf dem Server:
und auf dem Client
ich hoffe dieses Beispiel hat gezeigt, wie man einfache RMI Anwendungen unter Java 5 ohne
umständliche Generierung von ClientsStubs etc aufsetzen kann.
Gruß Tom
Hier mal ein kleines Beispiel zu RMI unter Java 5.
Welche schicken Neuerungen es für RMI unter Java 5 gibt könnt ihr hier:
http://today.java.net/pub/a/today/2005/10/06/the-new-rmi.html
oder hier:
http://java.sun.com/j2se/1.5.0/docs/guide/rmi/relnotes.html
nachlesen.
In diesem Beispiel verwenden wir zur Laufzeit erzeugte Dynamic Proxies als Client-Stubs.
(D.h. wir werden keinen rmic Stub Compiler verwenden)
In meinem Rechner habe ich mehrere Netzwerkkarten. Da ich die rmiregistry jedoch
explizit an das Network Interface mit der IP 192.168.76.98 binde muss ich beim lookup
der Registry die entsprechende IP Addresse mitgeben.
Unser Service Interface:
Code:
package de.tutorials.rmi.service;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IRemoteService extends Remote {
String remoteOperation(String[] arguments) throws RemoteException;
}
Unsere Service Implementierung:
Code:
/**
*
*/
package de.tutorials.rmi.service.impl;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Arrays;
import de.tutorials.rmi.service.IRemoteService;
/**
* @author Tom
*
*/
public class RemoteServiceImpl extends UnicastRemoteObject implements
IRemoteService {
public RemoteServiceImpl() throws RemoteException {
super();
}
public String remoteOperation(String[] arguments) throws RemoteException {
String result = Arrays.toString(arguments);
System.out.printf("remoteOperation invoked @%s with arguments %s\n",
System.currentTimeMillis(), result);
return result;
}
}
Unser Server:
Code:
/**
*
*/
package de.tutorials.rmi;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import de.tutorials.rmi.service.IRemoteService;
import de.tutorials.rmi.service.impl.RemoteServiceImpl;
/**
* @author Tom
*
*/
public class Bootstrap {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
Registry registry = LocateRegistry.getRegistry("192.168.76.98");
IRemoteService remoteService = new RemoteServiceImpl();
registry.rebind("remoteService", remoteService);
}
}
Unser Client:
Der Client liegt in meinem Beispiel auf einem anderen Rechner. Auf Clientseite liegen nur die
Interfaces unseres Services (IRemoteService) vor, nicht jedoch die Implementierung.
(Man könnte den Client natürlich auch so konfigurieren, dass er sich die Interface Klassen selber
lädt:
Beispiel ... die Klassen liegen in einem Verzeichnis namens bin im htdocs Verzeichnis eines Apache Webservers.
Unser Aufruf der RMI Registry sieht dann so aus:
Code:
C:\>rmiregistry -J-Djava.rmi.server.codebase=http://localhost/bin/ -J-Djava.rmi.server.hostname=192.168.76.98
Code:
/**
*
*/
package de.tutorials.rmi.client;
import java.lang.reflect.Proxy;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import de.tutorials.rmi.service.IRemoteService;
/**
* @author Tom
*
*/
public class Client {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
Registry registry = LocateRegistry.getRegistry("192.168.76.98", 1099);
IRemoteService remoteServiceProxy = (IRemoteService) registry
.lookup("remoteService");
System.out.println("Currently using a JDK Dynamic Proxy: "
+ Proxy.isProxyClass(remoteServiceProxy.getClass()));
System.out.println(remoteServiceProxy.remoteOperation(new String[] {
"a", "b" }));
}
}
Auf dem Server starte ich die rmiregsirty mit folgendem Kommando:
Code:
C:\>rmiregistry -J-Djava.class.path=E:\eclipse\3.1.1\eclipse\workspace\de.tutorials.rmi\bin -J-Djava.rmi.server.hostname=192.168.76.98
explizit an das Network Interface mit der IP 192.168.76.98 binde.
Nun starten wir den Server über:
Code:
E:\eclipse\3.1.1\eclipse\workspace\de.tutorials.rmi\bin>java de.tutorials.rmi.Bootstrap
Anschließend starten wir den Client auf dem anderen Rechner:
Code:
c:\eclipse\3.1.1\eclipse\workspace\de.tutorials.rmi.client\bin>java de.tutorials.rmi.client.Client
Nun erhalten wir eine ähnliche Ausgabe:
Auf dem Server:
Code:
remoteOperation invoked @1135529217000 with arguments [a, b]
und auf dem Client
Code:
Currently using a JDK Dynamic Proxy: true
[a, b]
ich hoffe dieses Beispiel hat gezeigt, wie man einfache RMI Anwendungen unter Java 5 ohne
umständliche Generierung von ClientsStubs etc aufsetzen kann.
Gruß Tom