Aufgabe Vorschlag B - 1 - Client-Server und Nebenläufigke… · Abitur Hessen Praktische Informatik LK 2021
Thema: Client-Server und Nebenläufigkeit · Aus der Prüfung LK (2021)
Aufgabenstellung
Kinocenter
Für das Management des Vorstellungsbetriebs eines Kinocenters sollen eine Client-Server-Anwendung und eine Datenbank entwickelt werden.
Material 1: UML-Klassendiagramm
Hinweis: Auf alle Attribute kann mittels get-Methoden zugegriffen werden.
Material 2: Klassendokumentationen
Klasse List
List<T>() erzeugt eine generische Liste mit Elementen des Typs T
add(obj: T) hängt das Objekt obj vom Typ T am Ende der Liste an.
add(index: int, obj: T) fügt das Objekt obj vom Typ T an der Position index in die Liste ein.
contains(obj: T): boolean liefert true, wenn das Objekt obj in der Liste enthalten ist, sonst false.
get(index: int): T liefert das Listenelement an der Position index zurück bzw. null, falls index negativ oder größer gleich der Anzahl der momentan enthaltenen Elemente ist.
remove(index: int): T entfernt das Listenelement an der Position index. Liefert das entfernte Element zurück bzw. null, falls index negativ oder größer gleich der Anzahl der momentan enthaltenen Elemente ist.
remove(obj: T): boolean entfernt das Objekt obj aus der Liste. Falls obj mehrmals in der Liste enthalten ist, wird nur das erste entfernt. Der Rückgabewert ist true, falls das Objekt gefunden und entfernt wurde, sonst false.
size(): int liefert die Anzahl der Elemente in der Liste zurück.
Klasse DateTime
DateTime() erzeugt ein DateTime-Objekt mit dem aktuellen Systemdatum und der Systemuhrzeit, im Format dd.mm.yyyy hh:mm.
compareTo(dt: DateTime): int Vergleicht Datum und Uhrzeit des DateTime-Objekts mit dem des Parameters dt und liefert einen int-Wert:
< 0 wenn das Datum des DateTime-Objekts vor dem des Parameters dt liegt
= 0 wenn das Datum des DateTime-Objekts gleich dem von dt ist
> 0 wenn das Datum des DateTime-Objekts nach dem des Parameters dt liegt
isAfter(date: DateTime): boolean liefert true, wenn das DateTime-Objekt nach dem des Parameters dt liegt
isBefore(date: DateTime): boolean liefert true, wenn das DateTime-Objekt vor dem des Parameters dt liegt
isEqual(dt: DateTime): boolean liefert true, wenn das DateTime-Objekt gleich dem des Parameters dt ist
Klasse ServerSocket
ServerSocket(localPort: int) erzeugt einen Server-Socket und bindet ihn an den angegebenen Port.
accept(): Socket wartet darauf, dass ein Client eine Verbindung aufbauen will. Wurde eine Verbindung aufgebaut, liefert die Methode das entsprechende Socket-Objekt.
close() schließt den Server-Socket.
Klasse Socket
Socket(remoteHostIP: String, remotePort: int) erzeugt ein Socket-Objekt.
connect(): boolean stellt eine Verbindung zum RemoteHost her; liefert true, wenn eine Verbindung hergestellt werden konnte.
readLine(): String liest eine Zeile vom Socket, bzw. liefert null, wenn der Socket nicht geöffnet ist. Eine Zeile wird durch ein Zeilenendezeichen abgeschlossen; das Zeilenendezeichen wird jedoch nicht in den zurückgegebenen String übernommen. Die Methode blockiert, bis eine komplette Zeile eingelesen ist.
write(s: String) schreibt einen String zum Socket; ist die Schnittstelle nicht geöffnet geschieht nichts.
close() löst die Verbindung auf.
Material 3: Sitzplan und Sitzbelegung
Beispielhafter Sitzplan des Kinosaals 3 mit 9 Reihen und 25 Sitzen pro Reihe
Hinweise: Die Nummer eines Sitzes setzt sich aus der Nummer der Reihe und der zweistelligen Nummer des Sitzes innerhalb der Reihe zusammen. Die Reihe 1 ist vorne im Saal, die Reihe 9 hinten.
Beispielhafte Sitzbelegung einer Vorstellung in diesem Kinosaal
Hinweis: true bedeutet der Sitz ist frei, false bedeutet der Sitz ist belegt. Der default-Wert einer Variablen des Typs boolean ist false.
Material 4: Vorlage UML-Sequenzdiagramm
Material 5: Beispiele für Kinokarten
Hinweis: Mehrere Karten können zusammen gekauft werden, sie haben dann dasselbe Kaufdatum, dieselbe Kaufuhrzeit sowie dieselbe ID. Jede Kinokarte verfügt darüber hinaus über eine individuelle, eindeutige Nummer, die von 1 ab fortlaufend hochgezählt wird.
Material 6: Vorlage UML-Klassendiagramm des Kartenkaufs
1.3
Die Klasse KinoManager (Material 1) besitzt die Methode erstelleVorstellung(film: Film, anzahlPlaetze: int, datumUhrzeit: DateTime). Diese Methode sucht nach einem Kinosaal, der zum gewünschten Zeitpunkt frei ist und mindestens die geforderte Anzahl von Plätzen hat. Ist ein passender Kinosaal gefunden, wird eine neue Vorstellung erzeugt und mit dem Film und dem Kinosaal verknüpft. Diese neue Vorstellung wird zurückgegeben. Falls keine neue Vorstellung erzeugt werden konnte, weil kein passender Kinosaal gefunden wurde, wird null zurückgegeben.
Entwickeln und zeichnen Sie ein Sequenzdiagramm für diese Methode.
Hinweis: Eine Vorlage ist in Material 4 zu finden.
1.4 Client-Server-Lösung
Das Kino-Management-System soll als Client-Server-Lösung realisiert werden, damit Kundinnen und Kunden (im Folgenden Kunde genannt) online Plätze reservieren können.
1.4.1
Erläutern Sie die Aufgaben und Funktionsweisen der Klassen Client, Server und ServerThread mit Thread sowie deren Zusammenarbeit mit der Klasse KinoManager (Material 1).
Hinweis: Der Server kann mehrere Clients parallel bedienen und läuft endlos.
1.4.2
Überführen Sie die im UML-Klassendiagramm (Material 1) dargestellte Klasse Server in Anweisungen einer objektorientierten Programmiersprache und implementieren Sie die aufgeführten Methoden.
Hinweis: Die Socket-Klassen sind in Material 2 beschrieben.
1.4.3
Wenn zwei Clients gleichzeitig für eine Vorstellung dieselben Sitzplätze belegen wollen, kann es passieren, dass diese Sitzplätze mehrfach belegt werden.
Erklären Sie anhand des Ablaufs der Methode belegeSitz(sitznr: int), wie es zu der Mehrfachbelegung kommen kann, und beschreiben Sie, wie diese auf Programm- bzw. Methodenebene zu verhindern ist.

Lösung
Nach den offiziellen Korrekturhinweisen
1.3 Entwickeln und zeichnen Sie ein Sequenzdiagramm für diese Methode.
Lösung:
1.4.1 Erläutern Sie die Aufgaben und Funktionsweisen der Klassen Client, Server und ServerThread mit Thread sowie deren Zusammenarbeit mit der Klasse KinoManager (Material 1).
Lösung: Client: Ein Besucher nutzt den Client für die Verbindungsaufnahme zum Server des Kinocenters und für die Anmeldung am Server. Über den Client kann der Besucher verschiedene Kommandos an den Server senden, um dessen Dienste in Anspruch zu nehmen. Server: Die Klasse Server implementiert einen Server, der an einem Port horcht und Verbindungsanfragen von Clients entgegennimmt. Hat er eine Verbindungsanfrage akzeptiert, erzeugt er einen ServerThread für diesen Client, da mehrere Clients parallel Anfragen senden können. Der Server erhält bei der Erzeugung eine Referenz auf ein Objekt der Klasse KinoManager, die die Anwendungsfälle des Kinocenters implementiert. ServerThread, Thread: Der ServerThread erbt von der Klasse Thread. Um den Dialog mit dem Client in einem nebenläufigen Prozess ausführen zu können, wird die run-Methode von Thread überschrieben. Damit die run-Methode nebenläufig (asynchron) ausgeführt wird, muss ein ServerThread mittels der von Thread geerbten start-Methode gestartet werden. Nach erfolgreicher Anmeldung kann sich ein Besucher Filme und Vorstellungen anzeigen lassen sowie Sitzplätze suchen und belegen. Hierzu stellt die Klasse KinoManager entsprechende Methoden (z. B. zeigeFilme(), zeigeVorstellungZuFilm(), ...) zur Verfügung. Um diese nutzen zu können, muss der ServerThread ein Objekt der Klasse KinoManager referenzieren. Diese Referenz wird dem ServerThread bei dessen Erzeugung (Konstruktor) übergeben. Die Kommunikation mit dem Client erfolgt über den, dem Konstruktor ebenfalls übergebenen, Socket.
1.4.2 Überführen Sie die im UML-Klassendiagramm (Material 1) dargestellte Klasse Server in Anweisungen einer objektorientierten Programmiersprache und implementieren Sie die aufgeführten Methoden.
Lösung: ```java public class Server { private ServerSocket serverSocket; private KinoManager kiman; public Server(int port, KinoManager kiman) { this.kiman = kiman; serverSocket = new ServerSocket(port); this.runServer(); } public void runServer() { while (true) { Socket clientSocket = serverSocket.accept(); new ServerThread(clientSocket, kiman).start(); } } } ```
1.4.3 Wenn zwei Clients gleichzeitig für eine Vorstellung dieselben Sitzplätze belegen wollen, kann es passieren, dass diese Sitzplätze mehrfach belegt werden. Erklären Sie anhand des Ablaufs der Methode belegeSitz(sitznr: int), wie es zu der Mehrfachbelegung kommen kann, und beschreiben Sie, wie diese auf Programm- bzw. Methodenebene zu verhindern ist.
Lösung: Erklärung: Wenn ein Client einen Sitzplatz belegen will, ruft der Kino-Manager die Methode belegeSitz(sitznr: int) der Klasse Vorstellung auf. In dieser Methode wird geprüft, ob der Sitz noch frei ist und falls er noch frei ist, wird er belegt, d. h. das entsprechende Feld-Element wird auf false gesetzt. Will nun ein zweiter Client denselben Sitz belegen und die Ausführung der Methode für den ersten Client wird nach der Prüfung vom Betriebssystem unterbrochen und der zweite Client kommt zum Zug, könnte er evtl. die Methode belegeSitz(...) komplett ausführen und damit den Sitz belegen. Wird daraufhin zur Ausführung der Methode für den ersten Client zurückgekehrt, wird die auf die Unterbrechung folgende Anweisung ausgeführt, d. h. der Sitz wird belegt. Damit ist der Sitz zweimal belegt. Verhinderung: Man kann dieses Problem vermeiden, indem man dafür sorgt, dass die Ausführung der Methode belegeSitz(...) nicht unterbrochen werden kann. Dazu muss die Methode synchronisiert werden (in Java z. B. durch das Schlüsselwort synchronized).
Die ausführliche Erklärung Schritt für Schritt (mit KI) gibt es mit Premium. Premium
Löse sie direkt hier: automatische Korrektur, Hinweise und Lösung Schritt für Schritt.
‹ Aufgabe Vorschlag A - 1 - Client-Server und Nebenläufigke… · LK 2021