Aufgabe Vorschlag B - 1 · Abitur Hessen Praktische Informatik LK 2022
Thema: Client-Server und Nebenläufigkeit · Aus der Prüfung LK (2022)
Aufgabenstellung
Material 1
1.6 Das EB-System ermöglicht einem Kunden den Zugriff auf sein Konto, um Überweisungen zu tätigen. Wurde vom EB-Server eine Verbindungsanfrage akzeptiert, werden Client-Anfragen entgegengenommen und gemäß Protokoll bearbeitet. Nach erfolgreicher Anmeldung kann der Kunde bei ausreichender Kontodeckung Überweisungen tätigen, bis er sich vom Server abmeldet. Eine typische Sitzung des EB sieht folgendermaßen aus:
( > für Antwort vom Server, < für Kommandos vom Client, <LF> Enter-Taste): > +OK E-Banking
< anmelden;DE06550205000222222222;4554<LF> (Client sendet IBAN und PIN)
> +OK Willkommen
< ueberweisen;DE68210501700012345678;Einkauf Topmarkt;99.76<LF> (IBAN des Empfängers, Buchungstext und Betrag)
> +OK Überweisung erfolgt
> Aktueller Kontostand: 108.04 EURO
< ueberweisen;DE68210501700012345678;KFZ-Versicherung;499.0<LF>
> -ERR Überweisung nicht erfolgt
> Aktueller Kontostand: 108.04 EURO
< quit<LF> In der Beispielsitzung meldet sich ein Kunde mit der IBAN DE06 5502 0500 0222 2222 22 und dem PIN 4554 erfolgreich an und überweist 99,76 EURO auf das Konto mit der IBAN DE68 2105 0170 0012 3456 78. Für die zweite Überweisung besteht keine ausreichende Deckung auf dem Konto und es wird eine entsprechende Meldung ausgegeben. Daraufhin meldet sich der Kunde ab.
1.6.1
Erläutern Sie das Client-Server-Modell anhand des EB-Systems unter Berücksichtigung der Begriffe "Client", "Server", "Dienst" und "Protokoll". [4 BE]
1.6.2
Implementieren Sie die Klasse EBServer aus Material 1 unter Berücksichtigung des in Aufgabe 1.6 wiedergegebenen Sitzungsprotokolls sowie des UML-Sequenzdiagramms für die Server-Seite aus Material 4. [9 BE]
Hinweise: Die Dokumentationen der Klassen Socket, ServerSocket und String sind in Material 3 zu finden. Zur Umwandlung eines Strings in eine Integer-Zahl bzw. Fließkommazahl stehen die Methoden Integer.parseInt(s: String): int und Double.parseDouble(s: String): double zur Verfügung.
1.6.3
Entwickeln und zeichnen Sie das UML-Sequenzdiagramm für die Client-Seite unter Berücksichtigung des in Aufgabe 1.6 wiedergegebenen Sitzungsprotokolls sowie des UML-Sequenzdiagramms für die Server-Seite (Material 4) in Material 5. [8 BE]
Hinweise: Die Methode getAnmeldeDaten() der Klasse EBClient liefert einen String in der Form anmelden;[iban];[pin], die Methode getUeberweisungsDaten() liefert einen String in der Form ueberweisen;[text];[iban];[betrag] bzw. quit für das Beenden der Sitzung.
1.7 Multithreading im EB-Server
Der EB-Server soll zukünftig mehrere Clients gleichzeitig bedienen können.
1.7.1
Beschreiben Sie die Eigenschaften von Prozessen und Threads. Erläutern Sie anhand des E-Banking-Systems, dass es zu Problemen kommen kann, wenn mehrere Threads auf eine Variable zugreifen und benennen Sie eine Lösung für das Problem. [4 BE]
1.7.2
Entwickeln Sie auf der Grundlage des Klassendiagramms aus Material 1 ein erweitertes Modell und zeichnen Sie dieses. [3 BE]
Hinweis: Es sind nur die für die Aufgabenstellung relevanten Klassen aus dem gegebenen Klassendiagramm (Material 1) zu übernehmen.

Lösung
Nach den offiziellen Korrekturhinweisen
1.6.1 Erläutern Sie das Client-Server-Modell anhand des EB-Systems unter Berücksichtigung der Begriffe "Client", "Server", "Dienst" und "Protokoll".
Lösung: Das Client-Server-Modell beschreibt die Möglichkeit, Aufgaben und Dienstleistungen innerhalb eines Netzwerks zu verteilen. Die Aufgaben werden von Programmen erledigt, die in Clients und Server unterteilt werden. Der EB-Client fordert die Erledigung einer Aufgabe vom EB-Server an, wie das Anmelden und Durchführen von Überweisungen. Der Client ist aktiv. Der Server ist passiv und wartet auf Verbindungsanfragen. Er bearbeitet die Anfrage und gibt eine Rückmeldung über den Erfolg der Ausführung. Ein Dienst ist eine solche festgelegte Aufgabe, die der Server anbietet und der Client nutzt. Die Regeln der Kommunikation für einen Dienst (Kommandos, die Bedeutung der zwischen Server und Client ausgetauschten Daten und Formate) werden durch ein Protokoll festgelegt. Das Protokoll ist spezifisch für den jeweiligen Dienst.
1.6.2 Implementieren Sie die Klasse EBServer aus Material 1 unter Berücksichtigung des in Aufgabe 1.6 wiedergegebenen Sitzungsprotokolls sowie des UML-Sequenzdiagramms für die Server-Seite aus Material 4.
Lösung: ```java public class EBServer { private ServerSocket server = null; private int port; private EBVerwaltung eb; public EBServer(int port, EBVerwaltung eb) { this.port = port; this.eb = eb; } public void startServer() { server = new ServerSocket(port); while(true) { Socket sc = server.accept(); sc.write("+OK E-Banking\n"); String anforderung = sc.readLine(); String[] werte = anforderung.split(";"); Konto k = null; k = eb.anmelden(werte[1], Integer.parseInt(werte[2])); if (k == null) { sc.write("-ERR Login fehlgeschlagen!\n"); } else { sc.write("+OK Willkommen\n"); anforderung = sc.readLine(); while (!anforderung.equals("quit")) { werte = anforderung.split(";"); Konto anderesKonto = eb.sucheKonto(werte[1]); if (anderesKonto != null) { if (eb.ueberweisen(k, anderesKonto, werte[2], Double.parseDouble(werte[3]))) { sc.write("+OK Überweisung erfolgt\n"); } else { sc.write("-ERR Überweisung nicht erfolgt\n"); } } else { sc.write("-ERR Ungültige IBAN\n"); } sc.write("Aktueller Kontostand: " + k.getKontostand() + " EURO\n"); anforderung = sc.readLine(); } } sc.close(); } } } ```
1.6.3 Entwickeln und zeichnen Sie das UML-Sequenzdiagramm für die Client-Seite unter Berücksichtigung des in Aufgabe 1.6 wiedergegebenen Sitzungsprotokolls sowie des UML-Sequenzdiagramms für die Server-Seite (Material 4) in Material 5.
Lösung: UML-Sequenzdiagramm EBClient: - Verbindung: `connect()` auf dem Socket, Empfang von `+OK E-Banking` mit optionalem Block `[ok = true]`. - Anmeldung: Aufruf von `getAnmeldeDaten()`, Senden über `write(daten + "\n")`, Antwortempfang mit `readLine()`. - Bedingter Block `[antwort = "+OK..."]`: - Aufruf von `getUeberweisungsDaten()` - Schleife `loop [daten <> "quit"]` mit Senden der Daten, Lesen des Ergebnisses (`readLine()`), Lesen des Kontostands (`readLine()`) und erneutem Aufruf von `getUeberweisungsDaten()`. - Beenden der Sitzung: Senden von `write("quit\n")` und `close()` auf dem Socket.
1.7.1 Beschreiben Sie die Eigenschaften von Prozessen und Threads. Erläutern Sie anhand des E-Banking-Systems, dass es zu Problemen kommen kann, wenn mehrere Threads auf eine Variable zugreifen und benennen Sie eine Lösung für das Problem.
Lösung: Beschreibung: Die sequentielle Ausführung von Anweisungen eines Programms stellt einen Prozess dar, für den ein eigener Speicherbereich reserviert ist und der vom Betriebssystem verwaltet, gestartet und angehalten wird. Ein Thread ist ein einzelner in sich geschlossener Steuerfluss innerhalb eines Prozesses. Jeder Prozess besitzt einen Haupt-Thread, mit dem das Programm gestartet wird (main). Mehrere neue Threads können vom Programm gestartet werden. Diese Threads laufen dann alle quasi-parallel ab, besitzen jeweils einen eigenen Zustand mit Befehlszähler und Stack, arbeiten aber im Gegensatz zu Prozessen auf demselben Speicherbereich im Arbeitsspeicher. Erläuterung: Mehrere Threads können über die Kontomethoden auf die Variable `kontostand` eines Konto-Objekts gleichzeitig zugreifen. Es darf aber nicht vorkommen, dass ein Thread bereits aus einem Objekt liest, während ein anderer Thread noch Daten desselben Objekts ändert. Somit könnte eine Überweisung erfolgen, obwohl keine ausreichende Deckung vorliegt. Lösung: Das wird verhindert, indem die Methoden `ueberweisen()` und `einzahlen()` synchronisiert werden (z. B. mit dem Schlüsselwort `synchronized`).
1.7.2 Entwickeln Sie auf der Grundlage des Klassendiagramms aus Material 1 ein erweitertes Modell und zeichnen Sie dieses.
Lösung: Erweitertes Klassendiagramm: - Klasse `EBThread` erbt von der Klasse `Thread` (Methoden `+ run()`, `+ start()`). - `EBThread` besitzt Attribute bzw. Assoziationen zu `Socket` (`- sc`, Multiplizität 1) und `EBVerwaltung` (`- bank`, Multiplizität 1). - `EBThread` bietet Konstruktor `+ EBThread(sc : Socket, bank : EBVerwaltung)` und Methode `+ run()`. - `EBServer` erzeugt `EBThread`-Instanzen (`<<create>>`-Abhängigkeit) und delegiert die Client-Bearbeitung.
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 - 2.5.2 · LK 2022 · Aufgabe Vorschlag A - 1 - Client-Server und Nebenläufigke… · LK 2021 ›