|
Roblet®-Development-Kit 2.2 (30Dez2015) API für Anwendungen |
||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object genRob.genControl.client.Client
public class Client
Eine Instanz dieser Klasse stellt einen Klienten für einen Roblet®-Server dar.
Die Benutzung dieser Klasse in einer Anwendung ist denkbar einfach (Beispiele weiter unten):
getServer(String)
, so kann man sich eine
Server-Repräsentanz (Server
) geben lassen, die
einen weitergehenden Zugriff auf den Server zuläßt
- insbesondere auf einzelne Fächer (Slot
) eines jeden
Servers.
addListener(NomineeListener)
, so wird man über
die in den Verzeichnisdiensten notierten Server-Kandidaten
(Nominee
) informiert.
Dazu muß noch der
Verzeichnisdienst des RDK
im Netz laufen.
Sieve
) an.
Alle von den Klassen der Bibliothek verwalteten Threads sind Dämonen und haben eine Priorität gleich des Klient-initialisierenden Threads. Allerdings ist es möglich, daß von dieser Bibliothek benutzte fremde Bibliotheken (z.B. RMI) Threads mit anderen Prioritäten und Dämon-Eigenschaften erzeugen.
Vorausgesetzt, daß alle Java™-Archive des RDK insbesondere org.roblet.jar im gleichen Verzeichnis wie DateApp.java liegen, kann mit folgendem kompiliert werden (Unix®/MacOS™/Linux, JDK 6):import genRob.genControl.client.Client; import java.io.Serializable; import java.util.Date; import org.roblet.Roblet; import org.roblet.Robot; // Anwendungsimplementierung public class DateApp { // Methode läuft natürlich lokal als Teil der Anwendung public static void main (String[] args) throws Exception { Client client = new Client (); String servername = "roblet.org"; try { Roblet roblet = new DateRoblet (); Date date = (Date) client. getServer (servername). getSlot (). run (roblet); System.out.println ("Date" + " of " + servername + " is " + date); } catch (Exception e) { e. printStackTrace (); } client. close (); } // Roblet®-Implementierung private static class DateRoblet implements Roblet, Serializable { // Interface Roblet // Methode läuft fern im Server (!) public Object execute (Robot rRobot) { return new Date (); } } }
javac -classpath org.roblet.jar:. DateApp.javaUnd unter Windows™:
javac -classpath org.roblet.jar;. DateApp.javaWill man es nun das Beispiel laufen lassen, gibt man folgendes ein (Unix®/MacOS™/Linux, JDK 6):
java -classpath org.roblet.jar:. DateAppUnd unter Windows™:
java -classpath org.roblet.jar;. DateApp
Diese Anwendung kompiliert man genauso (s.o.). Auch die Ausführung sieht gleich aus. Vor der Ausführung muß allerdings ein Verzeichnisdienst im lokalen Netz laufen (in separatem Terminal; im RDK-Verzeichnis; JDK 6):import genRob.genControl.client.Client; import genRob.genControl.client.Nominee; import genRob.genControl.client.NomineeListener; import java.io.Serializable; import java.util.Date; import org.roblet.Roblet; import org.roblet.Robot; // Anwendungsimplementierung public class DateAppAll { // Methode läuft natürlich lokal als Teil der Anwendung public static void main (String[] args) throws Exception { Client client = new Client (); client. addListener ( new NomineeListener () { public void addedNominee (Nominee nominee) { try { String servername = nominee. toString (); Roblet roblet = new DateRoblet (); Date date = (Date) nominee. getServer (). getSlot (). run (roblet); System.out.println ("Server date" + " of " + servername + " is " + date); } catch (Exception e) { e. printStackTrace (); } } public void removedNominee (Nominee nominee) {} } ); System.out.println ("<Enter> zum Abbrechen"); System.in.read (); client. close (); } // Roblet®-Implementierung private static class DateRoblet implements Roblet, Serializable { // Interface Roblet // Methode läuft fern im Server (!) public Object execute (Robot rRobot) { return new Date (); } } }
java -jar org.roblet.jar directoryAußerdem sollten in diesem Verzeichnisdienst ein Server sichtbar sein bzw. man muß einen Server starten (in separatem Terminal; im RDK-Verzeichnis; JDK 6):
java -jar org.roblet.jar server
Server
,
NomineeListener
,
Nominee
,
Sieve
,
Slot
Constructor Summary | |
---|---|
Client()
Erzeugt einen Klienten, wie er normalerweise benötigt wird - dabei wird kein Logging ermöglicht, aber der Zugriff auf Verzeichnisdienste aktiviert. |
|
Client(Log log)
Erzeugt einen Klienten, bei dem das Logging über die mitgegebene Instanz ermöglicht und der Zugriff auf Verzeichnisdienste aktiviert wird. |
|
Client(Log log,
boolean directories)
Erzeugt einen Klienten, welcher Log-Informationen generieren und auf Verzeichnisdienste zugreifen kann. |
Method Summary | |
---|---|
void |
addListener(NomineeListener listener)
Fügt einen Interessenten an Roblet®-Server-Kandidaten ( Nominee 's) hinzu. |
void |
close()
Schließt den Klienten und gibt Hilfsressourcen wieder frei. |
protected void |
finalize()
Wird vom "garbage collector" aufgerufen und stellt sicher, für den Klienten sicher, daß close() aufgerufen wird,
nachdem die Instanz nicht mehr referenziert wird. |
Server |
getServer(Identity identity)
Gibt eine Server-Repräsentanz zur angegebenen Identität zur Benutzung zurück. |
Server |
getServer(String servername)
Gibt eine Server-Repräsentanz zum angegebenen Server-Namen zur Benutzung zurück. |
void |
removeListener(NomineeListener listener)
Entfernt einen Interessenten an Roblet®-Server-Kandidaten ( Nominee 's). |
Methods inherited from class java.lang.Object |
---|
clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Constructor Detail |
---|
public Client() throws ClientException
close()
geschlossen werden, wenn er nicht
mehr benötigt wird.
Ein Aufruf entspricht
Client(null,true)
ClientException
- Fehler beim Erzeugen der RMI-Requisiten,
beim Hinzufügen des Verzeichnisdienst-Zugriffs
oder bei gesetzter Java™-Eigenschaft
genRob.genControl.client.protocol.RMIClient(Log,boolean)
,
Verzeichnisdienstpublic Client(Log log) throws ClientException
close()
geschlossen werden, wenn er nicht
mehr benötigt wird.
Ein Aufruf entspricht
Client(log,true)
log
- Instanz zur Verarbeitung von Log-Informationen
oder null, wenn keine solche Information erzeugt
werden soll
ClientException
- Fehler beim Erzeugen der RMI-Requisiten,
beim Hinzufügen des Verzeichnisdienst-Zugriffs
oder bei gesetzter Java™-Eigenschaft
genRob.genControl.client.protocol.RMIClient(Log,boolean)
,
Verzeichnisdienstpublic Client(Log log, boolean directories) throws ClientException
close()
geschlossen werden, um alle verwendeten
Ressourcen wieder freizugeben.
Wird der Zugriff auf Verzeichnisdienst nicht aktiviert, so werden auch keine RMI-Requisiten initialisiert.
Beim Zugriff auf Verzeichnisdienste bekommen alle im folgenden von
der Bibliothek intern gestarteten Threads die gleiche Priorität, wie die
des aufrufenden Thread
s.
Ebenso wird die zugehörige ThreadGroup
benutzt, um darin
eine ebensolche mit Namen client#x (x laufende Nummer)
für die zu startenen Threads zu erzeugen.
Für den Zugriff auf Verzeichnisdienste werden einige RMI-Requisiten
initialisiert.
Zu beachten ist, daß RMI seine Threads an anderer Stelle einhängt
und die Prioritäten nach eigenen Regeln setzt.
Alle gestarteten Thread
s des Klienten sind als Dämon
gekennzeichnet;
RMI hier wieder mit Ausnahmen.
Als Teil der RMI-Requisiten wird ein eigener SecurityManager
gesetzt, sofern in der Anwendung noch keiner gesetzt war.
Dieser erlaubt alles.
Wenn das nicht gewünscht ist, so muß vor der Erzeugung
eines Klienten ein eigener SecurityManager
gesetzt werden.
Weiterhin wird zur Unterstützung von RMI ein HTTP-Server gestartet,
der am nächsten freien Port lauscht.
Anfragen werden über den bei Aufruf dieses Konstruktors gesetzten
Kontext-Klassenladers (Thread.getContextClassLoader()
)
befriedigt.
Ist keiner gesetzt, so wird der Klassenlader der Klasse desselben
Thread
s und sofern dieser null ist, der
System-Klassenlader (ClassLoader.getSystemClassLoader()
) eingesetzt.
Für RMI wird passend die Java™-Eigenschaft
java.rmi.server.codebase gesetzt.
log
- Instanz zur Verarbeitung von Log-Informationen
oder null, wenn keine solche Information erzeugt
werden solldirectories
- Wenn true werden Verzeichnisdienste
verwendet, um Roblet®-Server aufzufinden.
Ansonsten werden die Dienste nicht kontaktiert und
gleichzeitig auch keine RMI-Umgebung initialisiert.
ClientException
- Fehler beim Erzeugen der RMI-Requisiten,
beim Hinzufügen des Verzeichnisdienst-Zugriffs
oder bei gesetzter Java™-Eigenschaft
genRob.genControl.client.protocol.RMIClient()
,
VerzeichnisdienstMethod Detail |
---|
public void close()
Ein mehrfacher Aufruf dieser Methode ist ungefährlich.
Schließt man den Klienten nicht, so endet die JVM solange nicht,
bis explizit ein Aufruf von System.exit(int)
erfolgt.
finalize()
public Server getServer(String servername) throws InterruptedException
Extrahiert Host-Name und Port-Nummer aus dem angegebenen Server-Namen. Ist kein Doppelpunkt im Server-Namen, so wird der Standard-Port 2001 angenommen. Ist der Server-Name null, so wird die Loopback-Schnittstelle des lokalen Rechners mit Standard-Port 2001 angenommen.
ACHTUNG: Die Aufspaltung nach Host-Name und Port-Nummer erfolgt einfach anhand des Doppelpunktes ohne weitere Handlungen. Der Aufrufer muß selbst sicherstellen, daß Host-Name und Port-Nummer den Konventionen (DNS, IPv4, IPv6 etc.) bzw. dem Bereich (normalerweise 1 bis 65535) entsprechen, also der Server-Name tatsächlich einen existierenden Server anspricht. Einzig für den Fall, daß nach dem Doppelpunkt keine ganze Zahl steht, wird der Host-Name gleich dem Server-Namen gesetzt und das Port als 2001 angenommen.
Es wird eine Verbindung zum Roblet®-Server aufgebaut,
um dessen Identität festzustellen,
da möglicherweise bereits eine Verbindung unter einem anderen
Namen besteht.
Ist letzteres der Fall, so wird die bereits bekannte Repräsentanz
zurückgegeben.
Pro Klient (Client
) wird für einen Server
immer die gleiche Repräsentanz (Instanz) zurückgegeben.
Man kann also bei Bedarf direkt auf Gleichheit prüfen.
Mehrmalige Aufrufe dieser Methode kann in bestimmten Fällen die Rückgabe verschiedener Server-Repräsentanzen zur Folge haben. Gründe dafür können Load-Balancer und Änderungen im DNS sein, welches andere Server sichtbar werden läßt.
servername
- Name des Roblet®-Servers in der Form host:port
oder host,
wobei host ein DNS-Name oder direkt eine
IP-Adresse sein kann und
port im Bereich von 1
bis 65535 liegen muß;
ohne Port-Angabe oder bei Unverständlichkeit
wird Standard-Port 2001 angenommen;
ein Wert von null spricht die
Loopback-Netzwerkschnittstelle auf 2001 an
InterruptedException
- falls der aufrufende Thread
beim Warten auf den Roblet®-Server durch die Anwendung
zum Unterbrechen aufgefordert wird oder bereits
vorher sein Unterbrechungssignal (interrupt flag)
gesetzt wargetServer(Identity)
,
addListener(NomineeListener)
public Server getServer(Identity identity) throws InterruptedException
Es wird eine Verbindung zum Roblet®-Server aufgebaut,
um dessen Identität festzustellen,
da möglicherweise bereits eine Verbindung unter einem anderen
Namen besteht.
Ist letzteres der Fall, so wird die bereits bekannte Repräsentanz
zurückgegeben.
Pro Klient (Client
) wird für einen Server
immer die gleiche Repräsentanz (Instanz) zurückgegeben.
Man kann also bei Bedarf direkt auf Gleichheit prüfen.
identity
- Identität des Roblet®-Servers
InterruptedException
- falls der aufrufende Thread
beim Warten auf den Roblet®-Server durch die Anwendung
zum Unterbrechen aufgefordert wird oder bereits
vorher sein Unterbrechungssignal (interrupt flag)
gesetzt wargetServer(String)
,
addListener(NomineeListener)
public void addListener(NomineeListener listener)
Nominee
's) hinzu.
Dieser Interessent wird über alle bereits gefundenen und zukünftige
Server-Kandidaten informiert.
Diese Methode ist nur dann von Wirkung, wenn der Klient für Verzeichnisdienste aktiviert wurde (vgl. ).
listener
- Interessent an Roblet®-Server-KandidatenremoveListener(NomineeListener)
,
getServer(String)
public void removeListener(NomineeListener listener)
Nominee
's).
Fortan erhält er keine Informationen mehr.
Ist der angegebene Interessent gar nicht eingemeldet gewesen, so passiert nichts.
listener
- Interessent an Roblet®-Server-KandidatenaddListener(NomineeListener)
protected void finalize()
close()
aufgerufen wird,
nachdem die Instanz nicht mehr referenziert wird.
finalize
in class Object
|
Roblet®-Development-Kit 2.2 (30Dez2015) API für Anwendungen |
||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |