Der QODT-Dienst
QODT-Server senden nach der Verbindung mit einem Client täglich ein neues Zitat (quote oft the day). Der QODT-Dienst arbeitet auf Port 17. Eine Liste von QODT-Servern findet man auf der Website https://wiki.freepascal.org/QOTD. Das Zitat in Abbildung 6 wurde vom Server „alpha.mike-r.com“ nach Aufruf folgender Main-Methode gesendet.
public static void main(String[] args) {
TCPIPConnection tcpipc = new TCPIPConnection("alpha.mike-r.com",17);
tcpipc.servernachrichtAusgeben();
}
Nutzung von Client-Diensten mithilfe der Klasse Client
Wenn ein Server keine Nachricht sendet, weil z.B. eine falsche Adresse oder ein falscher Port vom Client gesendet wurde, wird das Programm in der Methode receive der Klasse Connection blockiert. Um dies zu verhindern, wird im Folgenden die Klasse Client verwendet, die in einem nebenläufigen Prozess nur dann reagiert, wenn der verbundene Server eine Nachricht sendet.
Dokumentation der Klasse Client
Objekte von Unterklassen der abstrakten Klasse Client ermöglichen Netzwerkverbindungen zu einem Server mittels TCP/IP-Protokoll. Nach Verbindungsaufbau können Zeichenketten (Strings) zum Server gesendet und von diesem empfangen werden, wobei der Nachrichtenempfang nebenläufig geschieht. Zur Vereinfachung finden Nachrichtenversand und -empfang zeilenweise statt, d. h., beim Senden einer Zeichenkette wird ein Zeilentrenner ergänzt und beim Empfang wird dieser entfernt. Jede empfangene Nachricht wird einer Ereignisbehandlungsmethode übergeben, die in Unterklassen implementiert werden muss. Es findet nur eine rudimentäre Fehlerbehandlung statt, so dass z.B. Verbindungsabbrüche nicht zu einem Programmabbruch führen. Eine einmal unterbrochene oder getrennte Verbindung kann nicht reaktiviert werden.
- Client(String pServerIP, int pServerPort) Es wird eine Verbindung zum durch pServerIP und pServerPort spezifizierten Server aufgebaut, so dass Daten (Zeichenketten) gesendet und empfangen werden können.Kann die Verbindung nicht hergestellt werden, kann der Client nicht zum Datenaustausch verwendet werden.
- boolean isConnected() Die Anfrage liefert den Wert true, wenn der Client mit dem Server aktuell verbunden ist. Ansonsten liefert sie den Wert false.
- void send(String pMessage) Die Nachricht pMessage wird – um einen Zeilentrenner ergänzt – an den Server gesendet. Schlägt der Versand fehl, geschieht nichts
- void close() Die Verbindung zum Server wird getrennt und der Client kann nicht mehr verwendet werden. Ist der Client bereits vor Aufruf der Methode in diesem Zustand, geschieht nichts.
- void processMessage(String pMessage) Diese Methode wird aufgerufen, wenn der Client die Nachricht pMessage vom Server empfangen hat. Der vom Server ergänzte Zeilentrenner wurde zuvor entfernt. Die Methode ist abstrakt und muss in einer Unterklasse der Klasse Client überschrieben werden, so dass auf den Empfang der Nachricht reagiert wird. Der Aufruf der Methode erfolgt nicht synchronisiert.
Das folgende Java-Programm ruft den Daytime-Dienst des Daytime-Servers der FU Berlin auf.
import javax.swing.JOptionPane;
import netzklassen.Client;
public class DaytimeClient extends Client {
public DaytimeClient(String pServerIP) {
super(pServerIP, 13);
}
public void processMessage(String pMessage) {
JOptionPane.showMessageDialog(null,"Server sendet:\n" + pMessage);
}
public static void main(String[] args) {
DaytimeClient dtc = new DaytimeClient("time.fu-berlin.de");
}
}
Erläuterung:
Die Klasse DaytimeClient ist eine Unterklasse der Klasse Client. Die abstrakte Methoden processMessage der Klasse Client muss überschrieben werden. Die Methode processMessage (Zeilen 7 – 9) öffnet ein Nachrichtenfenster mit der Anzeige der vom Server empfangenen Nachricht. Die Methode wird automatisch aufgerufen, sobald eine Nachricht vom Server eintrifft. In der Main-Methode wird ein Objekt der Klasse DaytimeClient erzeugt, um Datum und Zeit abzufragen.
Aufgabe
Implementiere einen QOTD-Client mithilfe der Klasse Client und teste ihn. Stelle deine kommentierte und dokumentierte Implementation den anderen im git zur Verfügung.