Praktikum UDP-Programmierung
In diesem Versuch soll die Nutzung des UDP-Sockets in Java erprobt werden. Dazu soll analog zu dem bekannten Ping-Befehl ein Client programmiert werden, welcher Requests an einen Server versendet welcher die Request wiederum zurücksendet. Da mittels Java nicht direkt ICMP-Requests gesendet werden können, soll in diesem Praktikum das UDP-Protokoll verwendet werden.
Der Server ist bereits fertig implementiert. Sie müssen lediglich den dazu passenden Client programmieren. Da UDP lediglich einen unzuverlässigen Transport ermöglicht, sind Vorkehrungen auf der Anwendungsschicht bezüglich Fehlern zu treffen.
Um im Labor eine reale Internetverbindung zu simulieren, werden die Pakete vom Server künstlich um einen zufälligen Wert verzögert (AVERAGE_DELAY) und teilweise verworfen (LOSS_RATE). Testen Sie Ihren Client auf Funktionsfähigkeit mit verschiedenen Werten!
Der Aufruf des Servers erfolgt mittels:
java PingServer Portnummer
wobei eine Portnummer größer als 1023 gewählt werden sollte, um ohne Administratorrechte auszukommen.
Teil 1
Führen Sie als Einstieg und zum Testen der Abläufe bei der Java-Programmausführung das UDP-Beispiel aus der Vorlesung zum Thema Sockes aus (Klassen UDPClient und UDPServer).
Teil 2
- Nehmen Sie nun den bereitgestellten Quelltext PingServer und konfigurieren Sie diesen auf LOSS_RATE = 0 und AVARAGE_DELAY = 0.
- Programmieren Sie nun einen zum PingServer passenden PingClient.
- Versenden Sie ein Paket mit dem Inhalt “PING” + CRLF und stellen Sie die Antwort des Servers und die benötigte Zeit für die komplette Paketübermittlung (RTT – Round Trip Time) am Client dar (Der Zeilenabschluss CRLF = Carriage Return + Line Feed kann in Java mittels
\r\n
codiert werden). - Der Client soll mit folgendem Kommando aufgerufen werden:
java PingClient Hostadresse Portnummer
- Mit Hostadresse = localhost können Sie Client und Server auf der gleichen Maschine laufen lassen.
- Wenn die Anwendung korrekt funktioniert, können Sie am Server die LOSS_RATE auf 0.1 und AVERAGE_DELAY auf 100 stellen. Dies bedeutet 10% Paketverluste und im Mittel 100ms Verzögerung.
- Testen Sie Ihre Anwendung erneut.
- Sie werden feststellen, dass bei Paketverlusten der Client unendlich wartet. Sie können dies verhindern, indem Sie für das Socket einen Timeout einstellen mit der Methode
setSoTimeout(Zeit in Millisekunden)
. - Lassen Sie den Client den Ping insgesamt 10 mal hintereinander ausführen.
Teil 3
- Der Client soll insgesamt 10 Pakete an den Server senden. Ein neues Paket wird versendet, nachdem die Antwort eingetroffen ist oder die Wartezeit verstrichen ist.
- Da UDP ein unzuverlässiges Protokoll ist, können Pakete verloren gehen.
- Jedes Paket soll folgende Dinge beinhalten: Den Text “PING”, eine Sequenznummer, einen Zeitstempel und am Ende die beiden Steuerzeichen CRLF. Dies ergibt folgenden String als Paketinhalt:
PING Sequenznummer Zeitstempel CRLF
- Die Sequenznummern beginnen mit dem Wert 0. Der Zeitstempel beinhaltet die Uhrzeit zum Zeitpunkt des Versendens. Die einzelnen Teile der Nachricht werden mittels eines Leerzeichens separiert.
- Nach der Versendung jedes Paketes soll der Client bis zu einer Sekunde auf die Antwort warten. Kommt die Antwort nicht bis zu diesem Zeitpunkt, gehen Sie von einem Paketverlust aus.
- Der Client soll nach allen Requests das Minimum, Maximum und die durchschnittliche RTT anzeigen.
Hinweise:
- Studieren Sie das API der Klasse DatagramSocket für die Möglichkeiten zur Einstellung eines Timeouts.
- Sie können zur Erstellung des Clients den Quellcode des Servers nehmen und entsprechend modifizieren.
- Kommentieren Sie Ihre Quelltexte sinnvoll!
Fakultativ
Letzte Änderung: 24. October 2023 10:17