diff --git a/teil13/__pycache__/network.cpython-39.pyc b/teil13/__pycache__/network.cpython-39.pyc new file mode 100644 index 0000000..0ed0cae Binary files /dev/null and b/teil13/__pycache__/network.cpython-39.pyc differ diff --git a/teil13/fib.py b/teil13/fib.py new file mode 100644 index 0000000..bbcef23 --- /dev/null +++ b/teil13/fib.py @@ -0,0 +1,15 @@ +# fib.py +import sys + +# berechnet rekursiv die Fibonaccizahl n. +def fib(n): + +# Rekursionsbedingung + if n in [0,1]: + return 1 + else: +# Rekursionsaufruf + return fib(n-1) + fib(n-2) + +element = int(sys.argv[1]) +print(fib(element)) diff --git a/teil13/fibclient.py b/teil13/fibclient.py new file mode 100644 index 0000000..35a9744 --- /dev/null +++ b/teil13/fibclient.py @@ -0,0 +1,60 @@ +# encoding: utf-8 +# fibclient.py +import socket +import time +from network.const import __ADDRESS__ + +DISCONNECT_MESSAGE = "!DISCONNECT" + +# Verbindung herstellen +def connect(): + client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + client.connect(__ADDRESS__) + return client + +# msg senden +def send(client, msg): + message = msg.encode('utf-8') + client.send(message) + +# Daten empfangen +def receive(conn): + msg = conn.recv(64).decode('utf-8') + + return msg + +# Hauptmethode +def start(): +# String von Console lesen + answer = input('Verbindung aufbauen? (ja/nein)? ') + if answer.lower() != 'ja': + return + +# Verbindung aufbauen + connection = connect() + while True: + msg = input("Nachricht (q für quit): ") + +# Bei Eingabe == 'q' Schleife beenden. + if msg == 'q': + break +# Sonst eingegeben String an Server senden. + send(connection, msg) +# und auf Ergebnis warten. + result = receive(connection) + print(f'result={result}') + +# Fibonaccizahl isolieren. + fib = int(result.split('[')[0]) + print(f'Fibonnaci-Zahl ist {fib}') + print(f'[RESULT] {result}') + + +# zum Beenden die Nachricht 'quit an den Server senden + send(connection, 'quit') + time.sleep(1) + print('Disconnected') + +# Hauptprogramm: Client starten +if __name__ == '__main__': + start() diff --git a/teil13/fibserver.py b/teil13/fibserver.py new file mode 100755 index 0000000..f5d2229 --- /dev/null +++ b/teil13/fibserver.py @@ -0,0 +1,92 @@ +#! /usr/bin/python3 + +import socket +import threading +from network.const import __ADDRESS__ + +# Server-Socket aufbauen +server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + +#Socket an unsere Server-Adresse binden +server.bind(__ADDRESS__) + +# Set mit den verbundenen Clients +clients = set() + +# Locks für den Zugriff auf das Set +clients_lock = threading.Lock() + +# Unsere Arbeitsmethode: rekursive Fibonacci-Reihe +def fib(n): + +# Rekursionsbedingung + if n in [0,1]: + return 1 + else: +# Rekursionsaufruf + return fib(n-1) + fib(n-2) + +#bearbeitet eine eingehende Connection annehmen, pro Client ein seperater Thread +def handle_connection(conn,addr): + print(f"[NEW CONNECTION] {addr} Connected") + + try: + connected = True + while connected: + msg = conn.recv(64).decode('utf-8') + print(f'[RECEIVED] {msg}') + if not msg: + break + else: + if msg.startswith('fib:'): + element = int(msg[4:]) + fibo = fib(element) + print(f'[SENDING] fib({element})={fibo}') +# Ergebnis an Client senden. + with clients_lock: + for c in clients: + c.sendall(f'{fibo}'.encode('utf-8')) + else: + pass + + if msg == 'quit': + print('[DISCONNECT]') + connected = False + +# with clients_lock: +# for c in clients: +# c.sendall(f"[{addr}] {msg}".encode('utf-8')) + + finally: +# Clientverbindung abbauen und aus Set entfernen. + with clients_lock: + clients.remove(conn) + + conn.close() + + +# Start des Servers +def start(): + print('[SERVER STARTED]!') +# Horchen nach eingehender Verbindung + server.listen() + while True: +# Neue Verbindung annehmen + + conn, addr = server.accept() +# Neuen Client in Set aufnehmen + with clients_lock: + print(f'[ADDING CONNECTION] {conn}') + clients.add(conn) + +#Thread zur Bearbeitung des Requests starten. + thread = threading.Thread(target=handle_connection, args=(conn, addr)) + thread.start() + +#Hauptprogramm: Serverstart einleiten +if __name__ == '__main__': + start() + + + + diff --git a/teil13/get_requests.py b/teil13/get_requests.py new file mode 100644 index 0000000..c5cebe7 --- /dev/null +++ b/teil13/get_requests.py @@ -0,0 +1,11 @@ +import requests + +url = requests.get('https://raspithek.de') + + +data = url.text + + +print(data) + + diff --git a/teil13/get_urllib.py b/teil13/get_urllib.py new file mode 100644 index 0000000..0dd3674 --- /dev/null +++ b/teil13/get_urllib.py @@ -0,0 +1,20 @@ +# encoding: UTF-8 +import urllib.request + +# URL öffnen und Daten anfordern. Ohne spezielle Dateiangabe +# liefert der Webserver immer die index.html zurück. +fp = urllib.request.urlopen('https://raspithek.de') + +# Daten auslesen +data = fp.read() + +print(type(data)) +# Die Daten sin vom Datentyp Bytes und müssen daher erst +# zum UTF-8 String umkodiert werden. +str = data.decode('utf8') + +fp.close() + +print(str) + + diff --git a/teil13/index.html b/teil13/index.html new file mode 100644 index 0000000..99d98e4 --- /dev/null +++ b/teil13/index.html @@ -0,0 +1,554 @@ + + + + + + + Raspithek - Mit dem Raspberry Pi durchstarten + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+

Multithreading

+
+
+ + + Python Logo (CC-BY-SA The people from the Tango! project / Wikipedia) + +
+
+

Multithreading dient dazu, zwei Aufgaben gleichzeitig abarbeiten zu lassen. Dies spart je nach Anwendungsfall eine Menge Zeit.Für diesen Teil des Tutorials solltest dich auf jeden Fall mit dem Kapitel Zeitmessung beschäftigt haben Historisches Der Prozessor meines C64 war mit 1 MHz Taktfrequenz nicht schnell genug, um mehr als ein Programm gleichzeitig abarbeiten zu können. Erst … Weiterlesen

+
+ + +
+
+
+
+
+

Datum und Zeit mit Python verarbeiten

+
+
+ + + Python Logo (CC-BY-SA The people from the Tango! project / Wikipedia) + +
+
+

Datum und Zeit sind zwei wichtige Datentypen, den ich bisher außen vorgelassen habe, da sie etwas spezieller sind als andere Datentypen sind und mehr Erklärung bedürfen. Das aktuelle Datum ist weltweit nicht einheitlich, da das Jahr je nach Religion von unterschiedlichen Startpunkten definiert ist. Während für die Christen das Jahr 2023 nach Christi Geburt ist, … Weiterlesen

+
+ + +
+
+
+
+
+

Python und Dateien

+
+
+ + + Python Logo (CC-BY-SA The people from the Tango! project / Wikipedia) + +
+
+

Dateien sind die einfachste Möglichkeit, Daten dauerhaft zu speichern, wie du das in Python programmatisch machst, zeigt dir dieser Teil der Reihe. Dateien Letztendlich wird alles in Dateien gespeichert, seinen es Bilder, Briefe, Tabellen oder auch die Konfigurationsdateien in /etc deines Raspberry Pi. Auch Webseiten, die du aufrufst liegen auf dem Server in einer Datei. … Weiterlesen

+
+ + +
+
+
+
+
+

Typkonvertierung

+
+
+ + + Python Logo (CC-BY-SA The people from the Tango! project / Wikipedia) + +
+
+

Datentypen können in einen anderen umgwandelt werden. Implizit hast du dies mit den f-Strings bereits getan. Typkonvertierung wird dir vermutlich meistens bei Zahlen und Strings begegnen. str() Die str() Funktion wandelt einen Datentyp in einen String um. Nimm mal folgendes Beispiel: Wenn du das ausführst, erhälst du folgende Fehlermeldung vom Interpreter Das liegt daran, dass … Weiterlesen

+
+ + +
+
+
+
+
+

Exceptions in Python

+
+
+ + + Python Logo (CC-BY-SA The people from the Tango! project / Wikipedia) + +
+
+

Rückgabewerte Wie kann eine Methode machWas() in der Klasse Service im Modul Worker der aufrufenden Umgebung mitteilen, dass sie aufgrund eines Fehlers nicht korrekt arbeiten kann. Die früher übliche Methode, mit einem zurückgebenen Statuscode zu arbeiten, hat einen Haken. Zum einen muss genau festgelegt werden, für welchen Fehler, welcher Statuscode zurückgeliefert wird, um dann darauf … Weiterlesen

+
+ + +
+
+
+
+
+

Module in Python

+
+
+ + + Python Logo (CC-BY-SA The people from the Tango! project / Wikipedia) + +
+
+

Module sind in Python ein weiteres Mittel, den Quellcode übersichtlich zu organisieren. Während Klassen eher auf Ebene des Quellcodes optimieren, machen Module das eher im Dateisystem. Durch Klassen musst du nicht mehr alle Variablen und Methoden in eine Datei klatschen, dank Modulen liegt nicht mehr jede Datei in ein und demselben Verzeichnis. Module Module werden … Weiterlesen

+
+ + +
+
+
+
+
+

Übertaktung

+
+
+ + + Raspberry Pi 4B 8GB + +
+
+

Grundlagen Jeder Prozessor arbeitet mit einem gewissen Takt in dem er Befehle abarbeitet. Je höher der Takt, desto höher die Arbeitsgeschwindigkeit der CPU. Mit Übertaktung lässt sich ggf. etwas Geschwindigkeit aus der CPU herauskitzeln. Aktuelle Frequenz Um die aktuelle Frequenz festzustellen rufst das Programm neofetch auf, dass wir bei der Einrichtung des Raspberry Pi installiert … Weiterlesen

+
+ + +
+
+
+
+
+

Objekte in Python

+
+
+ + + Python Logo (CC-BY-SA The people from the Tango! project / Wikipedia) + +
+
+

Mit der objektorientierten Programmirung wurde in den 1960er Jahren entwickelt und in den letzten 40 Jahren immer populärer. Sie ist aus der Programmierung nicht mehr wegzudenken. Mit Objekten lässt sich der Quellcode von komplexen Projekten übersichtlich organisieren.Ein Objekt ist alles, was Daten zusammenfassen kann. Du hast Objekte schon kennengelernt, denn jeder String ist ein Objekt, … Weiterlesen

+
+ + +
+
+
+
+
+

Container

+
+
+ + + Python Logo (CC-BY-SA The people from the Tango! project / Wikipedia) + +
+
+

Container sind Datentypen in Python, die mehrere Variablen aufnehmen und den Zugriff darauf organisieren. Listen Listen hast du schon im letzten Teil kurz gesehen. Listen fassen mehrere Variablen des gleichen Typs zusammen (das ist aber mehr eine Konvention). In anderen Programmiersprachen werden Listen als Array verstanden. Daher leitet sich auch die Deklaration mit eckigen Klammern … Weiterlesen

+
+ + +
+
+
+
+
+

Strings in Python

+
+
+ + + Python Logo (CC-BY-SA The people from the Tango! project / Wikipedia) + +
+
+

Zeichenketten Die deutsche Bezeichnung Zeichenkette für String, macht es deutlicher. Strings sind einfach nur eine Aneinandrreihungen von beliebigen Zeichen. Du hast sie in den vorhergehenden Teilen schon kennengelernt. In einen String kannst du im Prinzip alles hineinstecken. Eine Stringkonstante wird entweder in doppelte Hochkommata wie oben oder in doppelte Gänsfüßchen eingefasst: Ich bevorzuge die Version … Weiterlesen

+
+ + +
+
+ +
+
+ + + + +
+
+ + + + + + + Consent Management Platform von Real Cookie Banner + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/teil13/network/__init__.py b/teil13/network/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/teil13/network/__init__.py @@ -0,0 +1 @@ + diff --git a/teil13/network/__pycache__/__init__.cpython-39.pyc b/teil13/network/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000..4eef26b Binary files /dev/null and b/teil13/network/__pycache__/__init__.cpython-39.pyc differ diff --git a/teil13/network/__pycache__/const.cpython-39.pyc b/teil13/network/__pycache__/const.cpython-39.pyc new file mode 100644 index 0000000..ad3ffcb Binary files /dev/null and b/teil13/network/__pycache__/const.cpython-39.pyc differ diff --git a/teil13/network/code.py b/teil13/network/code.py new file mode 100644 index 0000000..2264e1a --- /dev/null +++ b/teil13/network/code.py @@ -0,0 +1,10 @@ +def receive(conn): + msg = conn.recv(64).decode('utf-8') + + return msg + +def send(client, msg): + message = msg.encode('utf-8') + client.send(message) + + diff --git a/teil13/network/const.py b/teil13/network/const.py new file mode 100644 index 0000000..a08a9fb --- /dev/null +++ b/teil13/network/const.py @@ -0,0 +1,12 @@ +#network/const.py + +import socket + +# TCP Port +__PORT__ = 6554 + +#Server-IP +__SERVER__ = socket.gethostbyname(socket.gethostname()) + +# Server-Adresse (IP,Port) +__ADDRESS__ = (__SERVER__,__PORT__) diff --git a/teil13/substring.py b/teil13/substring.py new file mode 100644 index 0000000..7db929c --- /dev/null +++ b/teil13/substring.py @@ -0,0 +1,3 @@ + + +print('fib:58'[4:]) diff --git a/teil13/test.py b/teil13/test.py new file mode 100644 index 0000000..dd46224 --- /dev/null +++ b/teil13/test.py @@ -0,0 +1,5 @@ +from network.const import __SERVER__ +from network.const import __ADDRESS__ + +print(f'Server:{__SERVER__}') +print(f'Address:{__ADDRESS__}')