Praktikum 4: ein erster Anfang

This commit is contained in:
Johannes Theiner 2018-05-03 16:44:34 +02:00
parent 77ae068966
commit 4668fc7386
7 changed files with 75 additions and 19 deletions

View File

@ -1,8 +0,0 @@
A1:Relativitätstheorie:Einstein:15
B2:Quantenmechanik:Heisenberg:17
C2:Quantenphysik:Planck:5
T4:Thermodynamik:Kelvin:78
C2:Theoretische Physik:Kelvin:54
B2:Thermodynamik:Planck:44
T4:Quantenphysik:Planck:45
B2:Elektrodynamik:Kelvin:34

View File

@ -54,6 +54,11 @@
<version>4.12.1</version> <version>4.12.1</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.testifyproject.mock</groupId>
<artifactId>mockito</artifactId>
<version>1.0.4</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -0,0 +1,32 @@
package de.joethei.hs.java2.praktikum.praktikum4;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class KlausurenServer {
private int port;
private Map<String, Integer> data = new HashMap<>();
private ExecutorService executorService = Executors.newCachedThreadPool();
public KlausurenServer(int port) {
this.port = port;
try (ServerSocket serverSocket = new ServerSocket(port)) {
Socket socket = serverSocket.accept();
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
}
public static void main(String[] args) {
}
}

View File

@ -1,28 +1,53 @@
Entwickeln Sie eine Klasse KlausurenServer, mit der verwaltetet werden kann, welche Klausuren ein(e) Student/-in mitschreiben möchte. Zu einer Mail-Adresse werden dabei die IDs der Klausuren gespeichert, z.B. Entwickeln Sie eine Klasse KlausurenServer, mit der verwaltetet werden kann,
welche Klausuren ein(e) Student/-in mitschreiben möchte.
Zu einer Mail-Adresse werden dabei die IDs der Klausuren gespeichert, z.B.
max.mueller@stud.hs-emden-leer.de: 34, 45, 56 max.mueller@stud.hs-emden-leer.de: 34, 45, 56
peter.meier@stud.hs-emden-leer.de: 1, 8, 34, 67 peter.meier@stud.hs-emden-leer.de: 1, 8, 34, 67
axel.maier@stud.hs-emden-leer.de: 34, 56 axel.maier@stud.hs-emden-leer.de: 34, 56
... ...
Intern werden diese Daten als (key,value)-Paare in einer Map gespeichert, wobei als key die Mail-Adresse verwendet wird. Der Konstruktor der Klasse KlausurenServer erhält als Parameter den Port, auf dem Anfragen entgegengenommen werden. Jede Anfrage besteht aus einer Textzeile, die eines der nachfolgend beschriebenen Kommandos enthalten darf, wobei die Kommandos groß oder klein geschrieben werden können. Als Antwort wird eine Textzeile zurückgeschickt, die immer mit 0 (Misserfolg) oder 1 (Erfolg) beginnt. Die (key,value)-Paare sollen auch nach einem Stoppen und Starten des Servers erhalten bleiben und müssen somit in einer Datei gespeichert werden. Intern werden diese Daten als (key,value)-Paare in einer Map gespeichert, wobei als key die Mail-Adresse verwendet wird.
Der Konstruktor der Klasse KlausurenServer erhält als Parameter den Port, auf dem Anfragen entgegengenommen werden.
Jede Anfrage besteht aus einer Textzeile, die eines der nachfolgend beschriebenen Kommandos enthalten darf,
wobei die Kommandos groß oder klein geschrieben werden können.
Als Antwort wird eine Textzeile zurückgeschickt, die immer mit 0 (Misserfolg) oder 1 (Erfolg) beginnt.
Die (key,value)-Paare sollen auch nach einem Stoppen und Starten des Servers erhalten bleiben
und müssen somit in einer Datei gespeichert werden.
PUT key newvalue -> 1 oldvalue PUT key newvalue -> 1 oldvalue
Trägt unter dem Schlüssel key den Wert newvalue ein. Die Antwort besteht aus einer 1 und dem alten Wert des Schlüssels. Beim ersten Eintrag ist oldvalue ein leerer String. Falls newvalue Leerzeichen enthält, sollen diese entfernt werden. Trägt unter dem Schlüssel key den Wert newvalue ein. Die Antwort besteht aus einer 1 und dem alten Wert des Schlüssels.
Beim ersten Eintrag ist oldvalue ein leerer String. Falls newvalue Leerzeichen enthält, sollen diese entfernt werden.
GET key -> 1 value oder 0 GET key -> 1 value oder 0
Liefert den Wert, der unter dem Schlüssel key eingetragen ist. Die IDs der Klausuren werden dabei immer aufsteigend sortiert zurückgegeben. Wenn der Schlüssel nicht bekannt ist, ist die Antwort 0. Liefert den Wert, der unter dem Schlüssel key eingetragen ist.
Die IDs der Klausuren werden dabei immer aufsteigend sortiert zurückgegeben.
Wenn der Schlüssel nicht bekannt ist, ist die Antwort 0.
DEL key -> 1 oldvalue oder 0 DEL key -> 1 oldvalue oder 0
Löscht Schlüssel und Wert und liefert den gelöschten Wert zurück. Wenn der Schlüssel nicht bekannt war, wird 0 zurückgeliefert. Löscht Schlüssel und Wert und liefert den gelöschten Wert zurück.
Wenn der Schlüssel nicht bekannt war, wird 0 zurückgeliefert.
GETALL -> 1 value oder 0 GETALL -> 1 value oder 0
Liefert eine Auflistung aller Klausurenwahlen. Wenn die Wahl eines/einer Studierenden in der Wahl eines/einer anderen Studierenden enthalten ist, fällt diese für diese Anfrage weg. Beim obigen Beispiel würde die Wahl von Axel Maier entfallen, da diese Klausuren auch von Max Mueller gewählt wurden. value soll in folgender Form zurückgegeben werden: Liefert eine Auflistung aller Klausurenwahlen.
Wenn die Wahl eines/einer Studierenden in der Wahl eines/einer anderen Studierenden enthalten ist,
fällt diese für diese Anfrage weg.
Beim obigen Beispiel würde die Wahl von Axel Maier entfallen,
da diese Klausuren auch von Max Mueller gewählt wurden. value soll in folgender Form zurückgegeben werden:
[34,45,56],[1,8,34,67] [34,45,56],[1,8,34,67]
Falls (noch) keine Klausurenwahlen vorhanden sind, wird 0 zurückgegeben. Falls (noch) keine Klausurenwahlen vorhanden sind, wird 0 zurückgegeben.
STOP -> 1 STOP -> 1
Beendet den Dienst und somit den Server. Beendet den Dienst und somit den Server.
Eine main-Methode liest von der Kommandozeile einen Port ein, legt ein KlausurenServer-Objekt an und startet den Server. Eine main-Methode liest von der Kommandozeile einen Port ein, legt ein KlausurenServer-Objekt an und startet den Server.
Der KlausurenServer arbeitet ähnlich wie ein Webserver. Er verarbeitet jede Anfrage einzeln in einem eigenen Thread(!) und unabhängig von anderen Anfragen. Die Verbindung zum Client wird nach jeder Antwort wieder geschlossen. Ein Client, der mehrere Anfragen abwickeln möchte, muss für jede Anfrage eine neue Verbindung zum Server aufnehmen. Ein solches Protokoll wird als "zustandslos" bezeichnet, weil mit jeder Anfrage eine neue Kommunikationssequenz beginnt, die keine Informationen aus früheren Anfragen voraussetzt. Der KlausurenServer arbeitet ähnlich wie ein Webserver.
Praktisch alle Betriebssysteme enthalten einen Telnet-Client, mit dem der Klausurenserver getestet werden kann. Dieser muss bei Windows-Systemen aber ggfls. nachinstalliert werden. Das folgende Beispiel zeigt den Dialog auf einem Unix-System. Der KlausurenServer wurde in einem anderen Terminal gestartet und läuft bereits. Zur Vereinfachung sind die Protokollausgaben des Telnet-Clients ausgeblendet: Er verarbeitet jede Anfrage einzeln in einem eigenen Thread(!) und unabhängig von anderen Anfragen.
Die Verbindung zum Client wird nach jeder Antwort wieder geschlossen.
Ein Client, der mehrere Anfragen abwickeln möchte, muss für jede Anfrage eine neue Verbindung zum Server aufnehmen.
Ein solches Protokoll wird als "zustandslos" bezeichnet, weil mit jeder Anfrage eine neue Kommunikationssequenz beginnt,
die keine Informationen aus früheren Anfragen voraussetzt.
Praktisch alle Betriebssysteme enthalten einen Telnet-Client, mit dem der Klausurenserver getestet werden kann.
Dieser muss bei Windows-Systemen aber ggfls. nachinstalliert werden.
Das folgende Beispiel zeigt den Dialog auf einem Unix-System.
Der KlausurenServer wurde in einem anderen Terminal gestartet und läuft bereits.
Zur Vereinfachung sind die Protokollausgaben des Telnet-Clients ausgeblendet:
$ telnet localhost 2000 $ telnet localhost 2000
put max.mueller@stud.hs-emden-leer.de 34,45,56 put max.mueller@stud.hs-emden-leer.de 34,45,56

View File

@ -0,0 +1,4 @@
package de.joethei.hs.java2.tests;
public class KlausurenServerTest {
}

View File

@ -22,8 +22,6 @@ public class VorlesungsTest {
@Test @Test
public void binaryTree() { public void binaryTree() {
Tree<Integer> tree = new Tree<>(new Node<>(45, new Node<>(14), new Node<>(16))); Tree<Integer> tree = new Tree<>(new Node<>(45, new Node<>(14), new Node<>(16)));
Node<Integer> node = new Node<>(45, new Node<>(14), new Node<>(16)); Node<Integer> node = new Node<>(45, new Node<>(14), new Node<>(16));
assertEquals(Integer.valueOf(45), tree.getRoot().getValue()); assertEquals(Integer.valueOf(45), tree.getRoot().getValue());

View File

@ -14,7 +14,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
public class VorlesungsverzeichnisTest2 { public class VorlesungsverzeichnisTest2 {
String filename = "db_junit.txt"; String filename = "src/main/resources/praktikum3/vorlesungen-db.txt";
PrintWriter pw; PrintWriter pw;
Class<Vorlesung> c = Vorlesung.class; // Klasse Vorlesung vorhanden? Class<Vorlesung> c = Vorlesung.class; // Klasse Vorlesung vorhanden?