diff --git a/Semester_2/Einheit_07/Uebung_6_LSG.ipynb b/Semester_2/Einheit_07/Uebung_6_LSG.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..a9d65668500f2b30bd0af4b8727edc4f3845283a --- /dev/null +++ b/Semester_2/Einheit_07/Uebung_6_LSG.ipynb @@ -0,0 +1,446 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d24fe0d8", + "metadata": {}, + "source": [ + "# <font color='blue'>**Übung 6 - Datenanalyse - Pandas**</font>\n", + "(Diese Übung gehört zur Vorlesungseinheit 7)\n", + "\n", + "## <font color='blue'>**Problemstellung: Erstellen und Modifizieren eines Pandas-Datensatzes**</font>\n", + "\n", + "In der letzten Übung wurde ein großer Datensatz eingelesen und viel analysiert. Im Gegensatz dazu, wird in dieser kürzeren Übung ein kleiner Datensatz angelegt, modifiziert und weniger Auswertungen gemacht. Diese Übung sollte auf jeden Fall selbst ausprobiert werden, bevor die Lösung betrachtet wird.\n", + "\n", + "### <font color='blue'>**Problembeschreibung**</font>\n", + "\n", + "Folgende Ergebisse einer Umfrage einer Umfrage liegen vor. Dieser Datensatz soll manuell als Dataframe angelegt werden. Es gibt 6 Personen (um nicht so viel eintragen zu müssen) und 3 Fragen. Die erste Frage ist nur eine ja/nein Frage, die anderen Fragen haben Punkte zwischen 1 und 5.\n", + "\n", + "| Person | Frage 1 | Frage 2 | Frage 3 |\n", + "|---|---|---|---|\n", + "| Person 1 | ja | 3 | 5 |\n", + "| Person 2 | ja | 1 | 1 |\n", + "| Person 3 | nein | 3 | 4 |\n", + "| Person 4 | nein | 2 | 4 |\n", + "| Person 5 | ja | 2 | 5 |\n", + "| Person 6 | ja | 4 | 2 |\n", + "\n", + "Erstelle einen Pandas Dataframe mit den vorliegenden Daten. Die Spalte Person soll dabei der Index sein, die Fragenbezeichnung der Spaltenname.\n", + "\n", + "Erstelle nun mithilfe von Pandas Auswertungen: Durchschnittswerte der Fragen und Diagramme, wie viele Personen die Punktzahl vergeben haben (vgl. Histogramm).\n", + "\n", + "Erstelle zum Schluss eine neue Spalte/Serie mit der durchschnittlichen Bewertung der beiden Punktefragen (pro Person). Ggf. musst du auf den index achten. Gibt es eine Korrelation zwischen der Antwort auf Frage 2 und der durchschnittlichen Bewertung?\n", + "\n", + "### <font color='blue'>**Umsetzung**</font>" + ] + }, + { + "cell_type": "markdown", + "id": "b802cb5f", + "metadata": {}, + "source": [ + "Dataframe:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "76d8f081", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Frage 1</th>\n", + " <th>Frage 2</th>\n", + " <th>Frage 3</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>Person 1</th>\n", + " <td>True</td>\n", + " <td>3</td>\n", + " <td>5</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Person 2</th>\n", + " <td>True</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Person 3</th>\n", + " <td>False</td>\n", + " <td>3</td>\n", + " <td>4</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Person 4</th>\n", + " <td>False</td>\n", + " <td>2</td>\n", + " <td>4</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Person 5</th>\n", + " <td>True</td>\n", + " <td>2</td>\n", + " <td>5</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Person 6</th>\n", + " <td>True</td>\n", + " <td>4</td>\n", + " <td>2</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Frage 1 Frage 2 Frage 3\n", + "Person 1 True 3 5\n", + "Person 2 True 1 1\n", + "Person 3 False 3 4\n", + "Person 4 False 2 4\n", + "Person 5 True 2 5\n", + "Person 6 True 4 2" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "F1 = pd.Series([True, True, False, False, True, True])\n", + "F2 = pd.Series([3,1,3,2,2,4])\n", + "F3 = pd.Series([5,1,4,4,5,2])\n", + "\n", + "df = pd.DataFrame(data={\"Frage 1\":F1,\"Frage 2\":F2,\"Frage 3\":F3})\n", + "\n", + "df.index = [\"Person 1\", \"Person 2\", \"Person 3\", \"Person 4\", \"Person 5\", \"Person 6\"]\n", + "\n", + "df" + ] + }, + { + "cell_type": "markdown", + "id": "e1a6aca4", + "metadata": {}, + "source": [ + "Durchschnitte" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8cd5023d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Frage 1 0.666667\n", + "Frage 2 2.500000\n", + "Frage 3 3.500000\n", + "dtype: float64" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.mean()" + ] + }, + { + "cell_type": "markdown", + "id": "f12a6ac9", + "metadata": {}, + "source": [ + "Plot:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "bfc83f6d", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "<AxesSubplot:ylabel='Frequency'>" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "df[\"Frage 3\"].plot(kind=\"hist\")" + ] + }, + { + "cell_type": "markdown", + "id": "54426b00", + "metadata": {}, + "source": [ + "Durchschnittliche Punktzahl pro Person:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "59f2f5c6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Frage 1</th>\n", + " <th>Frage 2</th>\n", + " <th>Frage 3</th>\n", + " <th>Durchschnitt</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>Person 1</th>\n", + " <td>True</td>\n", + " <td>3</td>\n", + " <td>5</td>\n", + " <td>4.0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Person 2</th>\n", + " <td>True</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1.0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Person 3</th>\n", + " <td>False</td>\n", + " <td>3</td>\n", + " <td>4</td>\n", + " <td>3.5</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Person 4</th>\n", + " <td>False</td>\n", + " <td>2</td>\n", + " <td>4</td>\n", + " <td>3.0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Person 5</th>\n", + " <td>True</td>\n", + " <td>2</td>\n", + " <td>5</td>\n", + " <td>3.5</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Person 6</th>\n", + " <td>True</td>\n", + " <td>4</td>\n", + " <td>2</td>\n", + " <td>3.0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Frage 1 Frage 2 Frage 3 Durchschnitt\n", + "Person 1 True 3 5 4.0\n", + "Person 2 True 1 1 1.0\n", + "Person 3 False 3 4 3.5\n", + "Person 4 False 2 4 3.0\n", + "Person 5 True 2 5 3.5\n", + "Person 6 True 4 2 3.0" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mean = (F2+F3)/2\n", + "mean.index = [\"Person 1\", \"Person 2\", \"Person 3\", \"Person 4\", \"Person 5\", \"Person 6\"]\n", + "\n", + "df[\"Durchschnitt\"] = mean\n", + "df\n" + ] + }, + { + "cell_type": "markdown", + "id": "53d382b2", + "metadata": {}, + "source": [ + "Korrelation:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "3e1f3b22", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Frage 1</th>\n", + " <th>Frage 2</th>\n", + " <th>Frage 3</th>\n", + " <th>Durchschnitt</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>Frage 1</th>\n", + " <td>1.000000e+00</td>\n", + " <td>8.199540e-17</td>\n", + " <td>-0.235702</td>\n", + " <td>-0.184637</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Frage 2</th>\n", + " <td>8.199540e-17</td>\n", + " <td>1.000000e+00</td>\n", + " <td>0.174078</td>\n", + " <td>0.636364</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Frage 3</th>\n", + " <td>-2.357023e-01</td>\n", + " <td>1.740777e-01</td>\n", + " <td>1.000000</td>\n", + " <td>0.870388</td>\n", + " </tr>\n", + " <tr>\n", + " <th>Durchschnitt</th>\n", + " <td>-1.846372e-01</td>\n", + " <td>6.363636e-01</td>\n", + " <td>0.870388</td>\n", + " <td>1.000000</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Frage 1 Frage 2 Frage 3 Durchschnitt\n", + "Frage 1 1.000000e+00 8.199540e-17 -0.235702 -0.184637\n", + "Frage 2 8.199540e-17 1.000000e+00 0.174078 0.636364\n", + "Frage 3 -2.357023e-01 1.740777e-01 1.000000 0.870388\n", + "Durchschnitt -1.846372e-01 6.363636e-01 0.870388 1.000000" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.corr()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Semester_2/Einheit_09/Grundlagen-Networking.ipynb b/Semester_2/Einheit_09/Grundlagen-Networking.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..c80b1aa77ff5c591721e70d824204ddaf7bc5b66 --- /dev/null +++ b/Semester_2/Einheit_09/Grundlagen-Networking.ipynb @@ -0,0 +1,498 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f0b13807-b3b2-4f55-9581-9f8d4ffaa3b5", + "metadata": {}, + "source": [ + "## <font color='blue'>**Grundlagen Netzwerke**</font>\n", + "\n", + "Zweck von Netzwerken und deren Technologien: \n", + "* **Datenaustausch**: Innerhalb eines Netzwerkes können Daten/Dateien auf andere Rechner transferiert werden. Diese Daten stehen dann mehreren Personen auch auf anderen Computern zur Verfügung.\n", + "* **Ressourcenteilung**: Speicher, CPU, Drucker, Faxgeräte, Scanner, Internetzugänge, ... aber auch Anwendungen können gemeinsam genutzt werden.\n", + "* **Administration**: Computer in einem Netzwerk können zentral ggf. mit spezieller Software einfach administriert und gewartet werden.\n", + "* **Kommunikation**: Informationsaustausch von Computer zu Computer durch Kommunikationsanwendungen: Video-, Telefonanwendungen, E-Mail-Programme …\n", + "\n", + "Für die Umsetzung ist es notwendig, Konventionen für die genutzten Medien zum Zweck des Transfer von Daten/Informationen zwischen Sender und Empfänger zu vereinbaren, d.h. **Protokolle**\n", + "\n", + "### <font color='blue'>**Netzwerk-Referenzmodelle**</font>\n", + "\n", + "Unter einem Protokoll werden diverse Datenstrukturen und Konventionen,\n", + "wie der Ablauf der Kommunikation stattfindet, z.B. Folge von Nachrichten, und wie die Informationen jeweils zu interpretieren sind, z.B. Syntax der Nachrichten.\n", + "\n", + "In der Netzwerktechnologie wird das Prinzip der Schichtung verfolgt. \n", + "D.h. jede Schicht repräsentiert eine Abstraktionsebene, jede Schicht führt eine wohldefinierte Funktion aus, \n", + "es gibt nur schmale Schnittstellen zwischen Schichten, um Informationsfluss zu minimieren. Ziel ist es, die Komplexität eines offenen Rechnernetzes zu reduzieren. \n", + "Die Funktion der einzelnen Schicht ist aufgrund von international spezifizierten Standardprotokollen definiert.\n", + "Beispiele sinf die ISO/OSI Protokollfamilie und darin enthalten die TCP/IP Protokollsuite als de-facto Standard.\n", + "\n", + "\n", + "<div>\n", + "<img src=\"./Pics/Netzwerkschichten.png\" width=\"801\"/>\n", + "</div>\n", + "\n", + "* **Netzzugriff**: \n", + "Übertragung von Dateneinheiten unter Zeitbedingungen zwischen zwei benachbarten Rechnern, transparente Übertragung von Bitsequenzen, \n", + "Berücksichtigung der Eigenschaften der Übertragungsmodi (elektrisch, Lichtwelle), Zusammenfassung von Bitsequenzen zu Rahmen (Frames), Fehlererkennung und Fehlerkorrektur auf Rahmenebene. \n", + "<br>\n", + "Adressierung über die **MAC-Adresse** (Media-Access-Control)\n", + "\n", + "* **Internet**: \n", + "fehlerfreie Übermittlung einer Nachricht von einem Endrechner, über ein Netz von Routern (Vermittlungsrechnern) hinweg, bis hin zum zweiten Endrechner, \n", + "Zusammenschaltung von Teilstrecken zu einer End-zu-End Verbindung, Wegewahl und Vermittlung, Transporteinheit abhängig von der Vermittlungstechnik (bei Paketvermittlung: Pakete)\n", + "<br>\n", + "Adressierung über die **IP-Adresse** (IPv4 32bit / IPv6 128bit) mit der Trennung in den Netzwerk und Hostteil. Beispiel: \n", + "| Adresse | Wert | \n", + "|--------|------|\n", + "|IP-Adresse: | 130.94.122.195 |\n", + "|Netzmaske (16 gesetzte Bits): | 255.255.0.0 | \n", + "|Netzwerkteil: | 130.94.0.0 | \n", + "|Broadcastadresse: | 130.94.255.255 | \n", + "|Mögliche Adressen: | 130.94.0.1 – 130.94.255.254 |\n", + "\n", + "\n", + "* **Transport**:\n", + "fehlerfreier Transport zwischen zwei Prozessen auf zwei Endrechnern, bildet die anwendungs-orientierten Schichten auf die netzabhängigen Schichten ab\n", + "netzunabhängiger Transport von Nachrichten zwischen zwei Endsystemen, passt die vom Anwendungssystem geforderte Übertragungsqualität an die vom darunterliegenden Transportnetz angebotene Übertragungsqualität an. Beispiele: Transmission Control Protocol (**TCP**), User Datagram Protocol (**UDP**)\n", + "<br>\n", + "Adressierung über die **Portnummer** (16 Bits) als Verbindung zum Programm. \n", + "\n", + "* **Anwendung**:\n", + "Verschiedene Applikationsdienst-Elemente verfügbar, Auswahl hängt von den ablaufenden Anwendungen ab, z.B.\n", + "Dateizugriff (SFTP), Fernverarbeitung (telnet / Port 23 oder ssh / Port 22), Elektronische Post (SMTP / Port 25), Name Service (DNS), WWW (HTTP / Port 80)\n" + ] + }, + { + "cell_type": "markdown", + "id": "deda85ec-34da-4e96-8778-8865406f95a1", + "metadata": {}, + "source": [ + "### <font color='blue'>**HTTP-Protokoll**</font>\n", + "\n", + "HTTP steht für Hypertext Transfer Protocol) und befindet sich in der Anwendungsschicht\n", + "Es dient der Übertragung von Daten und ist der Standard im World Wide Web (WWW) zur Übertragung von Webseiten. \n", + "Die Webbrowser greifen fast ausschließlich mit diesem Protokoll auf Web-Server zu.\n", + "\n", + "#### <font color='blue'>**Ablauf einer HTTP-Transaktion (Request / Response)**</font>\n", + "\n", + "* Client baut eine Verbindung zum Server auf. Meist geschieht das über TCP/IP. \n", + "* Ist Verbindung da, schickt Client eine Datei-Anfrage (Request) an Server. Die Anfrage ist normaler Text (Zahlen, Zeichen und einige Sonderzeichen). \n", + "* Server hat anschließend die Möglichkeit zu antworten: z.B. der angeforderte Dateiinhalt oder eine Fehlermeldung.\n", + "\n", + "<div>\n", + "<img src=\"./Pics/HTTP.png\" width=\"801\"/>\n", + "</div>\n", + "\n", + "##### <font color='blue'>**Request**</font>\n", + "\n", + "Zeile 1: Wie: GET , Was: /index.html , HTTP-Versionsnummer der Anfrage <br>\n", + "Header: Zusatzinformationen zur Verarbeitung, Verbindung oder gewünschten Dateiformaten\n", + "\n", + " GET /index.html HTTP/1.1\n", + " Host: www.html-world.de\n", + " User-Agent: Mozilla/4.0\n", + " Accept: image/gif, image/jpeg, */*\n", + " Connection: Keep-Alive\n", + "\n", + "##### <font color='blue'>**Response**</font>\n", + "\n", + "Zeile 1: Zu verwendende HTTP-Version und Response-Code: Übertragungsstatus <br>\n", + "Header: Zusatzinfos zur Übertragung, dem Dokument etc., dann Leerzeile, Dokumenteninhalt\n", + "\n", + "\n", + " HTTP/1.1 200 OK\n", + " Date: Thu, 15 Jul 2004 19:20:21 GMT\n", + " Server: Apache/1.3.5 (Unix)\n", + " Accept-Ranges: bytes\n", + " Content-length: 46\n", + " Connection: close\n", + " Content-type: text/html\n", + "\n", + " <h1>Antwort</h1>\n", + " <p>Ich bin eine Antwort</p>\n", + " \n", + "Die Client-Server-Verbindung bleibt solange aufrecht, bis **eine Transaktion** abgeschlossen ist, d.h. bis zur Antwort des Servers. \n", + "Prinzipiell ist aber auch eine persistente Verbindung möglich.\n", + "\n", + "Request-Methoden (Auswahl)\n", + "* `GET, HEAD` – Download, Abfragen von Dokumenteneigenschaften\n", + "* `POST, PUT` – Upload von Antworten, Dokumenten\n", + "* `DELETE` – Löschen von Dokumenten \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "18634499-4294-4ec6-8dc4-c7014fc7ad79", + "metadata": {}, + "source": [ + "### <font color='blue'>**XML-Extensible Markup Language**</font>\n", + "\n", + "XML ist eine erweiterbare Auszeichnungssprache zur Repräsentation hierarchisch strukturierter, d.h. baumartig organisierter Daten im Format einer Textdatei.\n", + "Sie sollen sowohl Menschen als auch von Maschinen lesbar sein. \n", + "\n", + "Die wichtigste Struktureinheit eines XML-Dokumentes ist das Element. Elemente sind die Träger der Information in einem XML-Dokument. \n", + "Elemente können Text wie auch weitere Elemente als Inhalt enthalten. \n", + "Elemente bilden die Knoten des Strukturbaumes eines XML-Dokumentes. \n", + "Der Name eines XML-Elementes kann in XML-Dokumenten ohne Dokumenttypdefinition (DTD) frei gewählt werden. \n", + "In XML-Dokumenten mit DTD muss der Name eines Elementes in der DTD deklariert sein und \n", + "das Element muss sich in einer zugelassenen Position innerhalb des Strukturbaumes gemäß DTD befinden. \n", + "In der DTD wird u. a. der mögliche Inhalt eines jeden Elementes definiert. \n", + "\n", + "\n", + "### <font color='blue'>**Aufbau**</font>\n", + "\n", + "Jedes Element besitzt eine Auszeichnung mittels sogenannter Tags (Auszeichnungen):\n", + "\n", + "* `<Elementname>`: Starttag für den Beginn eines Elementes\n", + "* `</Elementname>`: Endtag für das Ende eines Elementes\n", + "* `Attributname=Attributwert`: Attributen im Starttag zur Beschreibung weiterer Eigenschaften des Elements \n", + "* `<!-- Kommentar-Text -->`: Kommentare\n", + "* `<?Zielname Daten?>`: Verarbeitungsanweisungen \n", + "\n", + "Beispiel: \n", + "\n", + " <?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n", + " <bookstore>\n", + " <book category=\"cooking\">\n", + " <title lang=\"en\">Everyday Italian</title>\n", + " <author>Giada De Laurentiis</author>\n", + " <year>2005</year>\n", + " <price>30.00</price>\n", + " </book>\n", + " <book category=\"children\">\n", + " <title lang=\"en\">Harry Potter</title>\n", + " <author>J K. Rowling</author>\n", + " <year>2005</year>\n", + " <price>29.99</price>\n", + " </book>\n", + " <book category=\"web\">\n", + " <title lang=\"en\">Learning XML</title>\n", + " <author>Erik T. Ray</author>\n", + " <year>2003</year>\n", + " <price>39.95</price>\n", + " </book>\n", + " </bookstore>\n", + "\n", + "### <font color='blue'>**XML-Familie**</font>\n", + "\n", + "Einige XML-Ausprägungen: \n", + "\n", + "* Text: DocBook, HTML \n", + "* Graphik: SVG, X3D \n", + "* Geodaten: GPX, OSM \n", + "* Multimedia: MPEG-7 \n", + "* Ingenieurwissenschaften: AutomationML, CAEX\n", + "* Mathematik: MathML\n", + "\n", + "Infratsruktur zur Handhabung von XML-Dokumenten: \n", + "\n", + "* XSLT, STX: Transformation von XML-Dokumenten\n", + "* XPath: Adressierung von Teilen eines XML-Baumes\n", + "* XPointer, XLink und XInclude: Verknüpfung von XML-Ressourcen\n", + "* XQuery: Selektion von Daten aus einem XML-Datensatz\n", + "* XSD, DTD: Definition von XML-Datenstrukturen\n", + "* Signatur und Verschlüsselung von XML-Knoten: XML Signature und XML-Encryption\n", + "* ... \n", + "* Definition zum Methoden- bzw. Funktionsaufruf durch verteilte Systeme: XML-RPC\n" + ] + }, + { + "cell_type": "markdown", + "id": "eee87805-5b67-40d9-be70-27c8aa623f04", + "metadata": { + "tags": [] + }, + "source": [ + "### <font color='blue'>**XML-RPC**</font>\n", + "\n", + "Der Standard XML-RPC (XML Remote Procedure Call) realisiert den entfernten Funktions- und Methodenaufruf über das Netzwerk als Client-Server-Lösung. \n", + "Die entfernten Funktionen können aus Sicht der Programmierung aufgerufen werden, als gehörten sie zum lokalen Programm. \n", + "Das Übertragen der Funktionsaufrufe, deren Parameter und des Rückgabewertes wird von der XML-RPC-Bibliothek übernommen\n", + "XML-RPC basiert auf zwei bereits existierenden Standards (XML und HTTP), so dass keine weiteren Protokolle einführt werden müssen. \n", + "Es ist daher einfach umzusetzbar und daher in vielen Programmiersprachen verfügbar. \n", + "\n", + "XML-RPC ist unabhängig von einer bestimmten Programmiersprache entwickelt worden, \n", + "so dass Client und Server in zwei verschiedenen Sprachen implementiert werden können.\n", + "Bei der Spezifikation galt es, einen Mindeststandard zu definieren, der von den Programmiersprache erfüllt wird. Dies betritt besonders die im Standard verfügbaren Datentypen.\n", + "\n", + "#### <font color='blue'>**XML-RPC-Server ... siehe Notebook Server**</font>\n", + "\n", + "#### <font color='blue'>**XML-RPC-Client**</font>\n", + "\n", + "Ein XML-RPC-Client wird mit der Klasse ServerProxy des Moduls xmlrpc.client realisiert: \n", + "\n", + "* `ServerProxy(uri, [transport, encoding, verbose, allow_none, use_datetime])` Erzeugt eine Instanz der Klasse ServerProxy, die mit dem XML-RPC-Server mit der URI (Uniform Resource Identifier) verbunden ist\n", + " * `transport`: Backend.\n", + " * `verbose`: Ausgabe alle ausgehenden und ankommenden XML-Pakete auf dem Bildschirm, wenn True.\n", + " * `use_datetime`: Repräsentation von Datums- und Zeitangaben anstelle der xmlrpc.client-internen Klasse DateTime die Klasse datetime, wenn True.\n", + " * `encoding` und `allow_none`: gleiche Bedeutung wie der Klasse SimpleXMLRPCServer\n", + "\n", + "Nach der Instanziierung der Klasse ServerProxy ist diese mit einem XML-RPC-Server verbunden und die beim Server registrierten Funktionen können aufrufen bzw. verwenden können. \n", + "\n", + "Sind Server-seitig die Introspection-Funktionen vom Server zugelassen, können dies auch aufgerufen werden: \n", + "\n", + "* `system.listMethods()`: Namen aller beim XML-RPC-Server registrierten entfernten Funktionen. \n", + "* `system.methodSignature(name)`: Auskunft über die Schnittstelle (Typen der Parameter) der registrierten Funktion mit dem Funktionsnamen `name`. Nur bei typgebunden Sprachen sinnvoll. \n", + "* `system.methodHelp(name)`: Liefert den Docstring der entfernten Funktion name zurück.\n", + "\n", + "#### <font color='blue'>**Begrenzungen**</font>\n", + "\n", + "Der XML-RPC-Standard ist nicht auf Python allein zugeschnitten, sondern es wurde bei der Ausarbeitung des Standards versucht, einen kleinsten gemeinsamen Nenner vieler Programmiersprachen zu finden, sodass beispielsweise Server und Client auch dann miteinander kommunizieren können, wenn sie in verschiedenen Sprachen geschrieben wurden.\n", + "\n", + "Daher bringt die Verwendung von XML-RPC einige Einschränkungen mit sich, was die komplexeren bzw. exotischeren Datentypen von Python betrifft. \n", + "So gibt es im XML-RPC-Standard beispielsweise keine Repräsentation der Datentypen complex, set und frozenset. Eine Unterstützung besonderer Datentypen bedarf einer Abbildung der Typen auf die, die XML-RPC unterstützt. \n", + "Beispielsweise kann eine komplexe Zahl über eine XML-RPC-Schnittstelle geschickt werden, indem Sie Real- und Imaginärteil getrennt jeweils als Zahl übermitteln.\n", + "\n", + "Folgende Datentypen sind im XML-RPC-Standard vorgesehenen:\n", + "\n", + "| XML-RPC | Python |Anmerkungen|\n", + "|---|---|---|\n", + "|boolesche Werte|bool|–|\n", + "|ganze Zahlen|int|–|\n", + "|Gleitkommazahlen|float|–|\n", + "|Strings|str|–|\n", + "|Arrays|list|In der Liste dürfen als Elemente nur XML-RPC-konforme Instanzen verwendet werden.|\n", + "|Strukturen|dict|Alle Schlüssel müssen Strings sein. Als Werte dürfen nur XML-RPC-konforme Instanzen verwendet werden.|\n", + "|Datum/Zeit|DateTime|Der spezielle Datentyp xmlrpc.client.DateTime wird verwendet.|\n", + "|Binärdaten|Binary|Der spezielle Datentyp xmlrpc.client.Binary wird verwendet.|\n", + "|Nichts|None|Nur möglich, wenn der Client mit allow_none=True erzeugt wurde.|\n", + "|Gleitkommazahlen mit beliebiger Genauigkeit|decimal.Decimal|\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "3b15b3f5-501f-4948-9e69-d201084a91b1", + "metadata": { + "tags": [] + }, + "source": [ + "#### <font color='blue'>**Beispiel für einen XML-RPC-Client**</font>\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "fc3dca97-85fd-4c40-a465-8b7c70a4e6ec", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9 + 4 is 13\n", + "9 - 4 is 5\n", + "9 * 4 is 36\n", + "9 / 4 is 2.25\n" + ] + } + ], + "source": [ + "import xmlrpc.client\n", + "\n", + "hostAddress = '127.0.0.1'\n", + "hostPort = '12345'\n", + "\n", + "URI = \"http://\" + hostAddress + \":\" + hostPort\n", + "\n", + "proxy = xmlrpc.client.ServerProxy(URI, verbose=False)\n", + "\n", + "num1 = 9\n", + "num2 = 4\n", + "\n", + "print('{} + {} is {}'.format(num1, num2, proxy.addition(num1, num2)))\n", + "print('{} - {} is {}'.format(num1, num2, proxy.subtraction(num1, num2)))\n", + "print('{} * {} is {}'.format(num1, num2, proxy.multiplication(num1, num2)))\n", + "print('{} / {} is {}'.format(num1, num2, proxy.division(num1, num2)))" + ] + }, + { + "cell_type": "markdown", + "id": "15e3ab96-34d5-4523-8553-204eea2b1f64", + "metadata": {}, + "source": [ + "Kontroll-Output des Clients der ersten Server-Anfrage:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7103a2c0-d23d-4c81-81c3-ad8b322eb07b", + "metadata": {}, + "outputs": [], + "source": [ + "send: b'POST /RPC2 HTTP/1.1\\r\\n\n", + " Host: 127.0.0.1:12345\\r\\n\n", + " Accept-Encoding: gzip\\r\\n\n", + " Content-Type: text/xml\\r\\n\n", + " User-Agent: Python-xmlrpc/3.8\\r\\n\n", + " Content-Length: 192\\r\\n\n", + " \\r\\n'\n", + "send: b\"<?xml version='1.0'?>\\n\n", + " <methodCall>\\n\n", + " <methodName>addition</methodName>\\n\n", + " <params>\\n\n", + " <param>\\n\n", + " <value><int>9</int></value>\\n\n", + " </param>\\n\n", + " <param>\\n\n", + " <value><int>4</int></value>\\n\n", + " </param>\\n\n", + " </params>\\n\n", + " </methodCall>\\n\"\n", + "\n", + "reply: 'HTTP/1.0 200 OK\\r\\n'\n", + "header: Server: BaseHTTP/0.6 Python/3.8.10\n", + "header: Date: Tue, 20 Jun 2023 13:18:08 GMT\n", + "header: Content-type: text/xml\n", + "header: Content-length: 122\n", + "body: b\"<?xml version='1.0'?>\\n\n", + " <methodResponse>\\n\n", + " <params>\\n\n", + " <param>\\n\n", + " <value><int>13</int></value>\\n\n", + " </param>\\n\n", + " </params>\\n\n", + " </methodResponse>\\n\"" + ] + }, + { + "cell_type": "markdown", + "id": "400fae51-775e-4e8c-a6fd-f5052911593d", + "metadata": {}, + "source": [ + "Test der Server-Erweiterungen " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "4d3d1370-6dcd-4f90-85f0-f7f98e7be32c", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "127.0.0.1\n", + "['add', 'addition_array', 'currentTime', 'division', 'getCount', 'getData', 'helpMe', 'multiplication', 'name', 'serverTime', 'subtraction', 'system.listMethods', 'system.methodHelp', 'system.methodSignature']\n", + "['add', 'addition_array', 'currentTime', 'division', 'getCount', 'getData', 'helpMe', 'multiplication', 'name', 'serverTime', 'subtraction', 'system.listMethods', 'system.methodHelp', 'system.methodSignature']\n", + "Addiert zwei Zahlen\n", + "11:08:42\n" + ] + } + ], + "source": [ + "proxy = xmlrpc.client.ServerProxy(URI, verbose=False)\n", + "\n", + "print(proxy.name())\n", + "print(proxy.helpMe())\n", + "print(proxy.system.listMethods())\n", + "print(proxy.system.methodHelp('add'))\n", + "print(proxy.serverTime())" + ] + }, + { + "cell_type": "markdown", + "id": "b449453f-48ee-4f82-9164-0a860a52549c", + "metadata": { + "tags": [] + }, + "source": [ + "Test der Server-Erweiterungen für die numpy-Array Handhabung: " + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "d0e26eb1-b1e8-4ece-b225-ce9c54cfa2a5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2. 4. 6.]\n" + ] + } + ], + "source": [ + "import numpy \n", + "\n", + "proxy = xmlrpc.client.ServerProxy(URI, verbose=False)\n", + "\n", + "num3 = numpy.array( [1.0,2.0,3.0] ) \n", + "num4 = 10\n", + "\n", + "print( numpy.array( proxy.addition_array( num3.tolist(), num3.tolist() ) ) )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b2cf197-9769-438b-aacf-989dd58d34e9", + "metadata": {}, + "outputs": [], + "source": [ + "Test der Servererweiterung mit Objekt-Methoden: " + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "f7579dd1-37ab-413f-9449-338de21f0255", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1020\n", + "42\n", + "1021\n", + "20230621T11:12:20\n" + ] + } + ], + "source": [ + "print(proxy.getCount(10))\n", + "print(proxy.getData())\n", + "print(proxy.getCount(10))\n", + "print(proxy.currentTime.getCurrentTime())" + ] + } + ], + "metadata": { + "@deathbeds/ipydrawio": { + "xml": "" + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Semester_2/Einheit_09/Grundlagen-Server.ipynb b/Semester_2/Einheit_09/Grundlagen-Server.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..51211f7c5fb6cf49137a79c6758fc9234c6cf5bc --- /dev/null +++ b/Semester_2/Einheit_09/Grundlagen-Server.ipynb @@ -0,0 +1,283 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7671966d-f256-49ca-80c4-1d6181acc60a", + "metadata": {}, + "source": [ + "### <font color='blue'>**XML-RPC-Server**</font>\n", + "\n", + "Der Server wird in der Regel mittels der Klasse `SimleXMLRPCServer` implementiert: \n", + "\n", + "* `SimleXMLRPCServer(addr, [requestHandler, logRequests, allow_none, encoding, bind_and_activate])`\n", + " * `addr`: Spezifikation der IP-Adresse und des Ports als Tuple (ip, port), an die der Server gebunden wird. \n", + " * `requestHandler`: Backend, das eingehende Daten in einen Funktionsaufruf zurückzuverwandeln. default: SimpleXMLRPCRequestHandler\n", + " * `logRequest`: Protokollierung der einkommenden Funktionsaufrufe. default: True \n", + " * `allow_none`: erlaubt es `None` in XML-RPC-Funktionen zu verwenden. default: True \n", + " * `encoding`: Encoding zur Datenübertragung. default: UTF-8\n", + " * `bind_and_activate`: Bindung an Adresse direkt nach der Instanziierung. default: True\n", + " \n", + "Methoden der Klasse `SimleXMLRPCServer`\n", + "\n", + "* `s.register_function(function, [name])`: \n", + " Registrierung des Funktionsobjekts function für einen RPC-Aufruf. Optional: Name, über den die Funktion vom Client zu erreichen ist. \n", + " \n", + "* `s.register_instance(instance, [allow_dotted_names])`:\n", + " Registrierung einer Instanz instance für den entfernten Zugriff. \n", + " Wenn der Client eine Methode dieser Instanz aufruft, wird der Aufruf durch die spezielle Methode _dispatch geleitet, \n", + " um den Aufruf einer Methode und ihren Parametern zuzuordnen. \n", + " \n", + "* `s.register_introspection_functions()`: \n", + " Registrierung der Funktionen `system.listMethods`, `system.methodHelp` und `system.methodSignature` für den entfernten Zugriff. \n", + "\n", + "* `s.register_multicall_functions()`:\n", + " Registrierung der Funktion `system.multicall`. Mit der Funktion `system.multicall` kann der Client mehrere Methodenaufrufe bündeln. \n", + " Auch die Rückgabewerte der Methodenaufrufe werden gebündelt zurückgegeben.\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "91376581-9808-4db2-840d-254291726be3", + "metadata": {}, + "source": [ + "#### <font color='blue'>**Beispiel Server 1**</font>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8134ccc4-070a-4139-982d-d73d20f07d7d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from xmlrpc.server import SimpleXMLRPCServer\n", + "\n", + "hostAddress = '127.0.0.1'\n", + "port = '12345'\n", + "\n", + "server = SimpleXMLRPCServer((hostAddress, int(port)))\n", + "\n", + "server.register_introspection_functions()\n", + "\n", + "def addition(x, y):\n", + " return x + y\n", + "\n", + "def subtraction(x, y):\n", + " return x - y\n", + "\n", + "def multiplication(x, y):\n", + " return x * y\n", + "\n", + "def division(x, y):\n", + " try:\n", + " return x / y\n", + " except ZeroDivisionError:\n", + " return \"Division durch 0!\"\n", + "\n", + "server.register_function(addition)\n", + "server.register_function(subtraction)\n", + "server.register_function(multiplication)\n", + "server.register_function(division)\n", + "\n", + "server.serve_forever()\n" + ] + }, + { + "cell_type": "markdown", + "id": "88535bd5-1e27-4b8a-9248-ba647794bdda", + "metadata": { + "tags": [] + }, + "source": [ + "#### <font color='blue'>**Beispiel Server 2**</font>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a0fb420b-4d4a-4458-8ddd-90be08643a90", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "127.0.0.1 - - [21/Jun/2023 11:08:42] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:08:42] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:08:42] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:08:42] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:08:42] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:16] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:16] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:16] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:16] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:18] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:18] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:18] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:18] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:18] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:18] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:18] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:18] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:19] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:20] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:20] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:20] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:20] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:20] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:20] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:20] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:20] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:20] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:20] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:20] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:12:20] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:16:43] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:16:56] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:16:56] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:16:56] \"POST /RPC2 HTTP/1.1\" 200 -\n", + "127.0.0.1 - - [21/Jun/2023 11:16:56] \"POST /RPC2 HTTP/1.1\" 200 -\n" + ] + } + ], + "source": [ + "import sys, time\n", + "import numpy \n", + "from xmlrpc.server import SimpleXMLRPCServer\n", + "\n", + "hostAddress = '127.0.0.1'\n", + "port = '12345'\n", + "\n", + "server = SimpleXMLRPCServer((hostAddress, int(port)))\n", + "\n", + "server.register_introspection_functions()\n", + "\n", + "def addition(x, y):\n", + " \"\"\"\n", + " Addiert zwei Zahlen\n", + " \"\"\"\n", + " return x + y\n", + "\n", + "def subtraction(x, y):\n", + " return x - y\n", + "\n", + "def multiplication(x, y):\n", + " return x * y\n", + "\n", + "def division(x, y):\n", + " try:\n", + " return x / y\n", + " except ZeroDivisionError:\n", + " return \"Division durch 0!\"\n", + " \n", + "server.register_function(addition, 'add')\n", + "server.register_function(subtraction)\n", + "server.register_function(multiplication)\n", + "server.register_function(division)\n", + "\n", + "\n", + "# Erweiterungen für Services \n", + "def name():\n", + " return hostAddress\n", + " \n", + "def helpMe():\n", + " return server.system_listMethods()\n", + " \n", + "def helpSignature(name):\n", + " return server.system.methodSignature(addition)\n", + "\n", + "def serverTime():\n", + " return time.strftime(\"%H:%M:%S\")\n", + "\n", + "server.register_function(name)\n", + "server.register_function(helpMe)\n", + "server.register_function(serverTime)\n", + "\n", + "\n", + "# Erweiterung für numpy-Arrays \n", + "def addition_array(x, y):\n", + " if type(x) == list: \n", + " x = numpy.array( x )\n", + " if type(y) == list: \n", + " y = numpy.array( y )\n", + " z = x + y\n", + " if type( z ) == numpy.ndarray: \n", + " return z.tolist()\n", + " return z \n", + "\n", + "server.register_function(addition_array)\n", + " \n", + " \n", + "# Erweiterungen für Methoden von Klassen-Objekten \n", + "import datetime\n", + "\n", + "class ExampleService:\n", + " def __init__( self, count ): \n", + " self.count = count\n", + " def getData(self):\n", + " self.count += 1\n", + " return '42'\n", + " def getCount(self, value):\n", + " return value + self.count\n", + "\n", + " class currentTime:\n", + " @staticmethod\n", + " def getCurrentTime():\n", + " return datetime.datetime.now()\n", + "\n", + "exService = ExampleService(1000)\n", + "server.register_instance(exService, allow_dotted_names=True)\n", + "\n", + "server.serve_forever()\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Semester_2/Einheit_09/Pics/HTTP.png b/Semester_2/Einheit_09/Pics/HTTP.png new file mode 100644 index 0000000000000000000000000000000000000000..01f5c68e9e634d9ae79f983387057bf1ba0782b9 Binary files /dev/null and b/Semester_2/Einheit_09/Pics/HTTP.png differ diff --git a/Semester_2/Einheit_09/Pics/Netzwerkschichten.png b/Semester_2/Einheit_09/Pics/Netzwerkschichten.png new file mode 100644 index 0000000000000000000000000000000000000000..e93edb978e236e632584147fe4b569c88fd4e639 Binary files /dev/null and b/Semester_2/Einheit_09/Pics/Netzwerkschichten.png differ