Assignment Chef icon Assignment Chef
All German tutorials

Programming lesson

WeatNet-Wetter-App: Socket-Programmierung & Multithreading in der Praxis

Lerne, wie du eine Client/Server-Wetter-App mit Socket-Programmierung, Multithreading und der OpenWeatherMap-API entwickelst – inklusive Authentifizierung, Hashing und JSON-Dateitransfer.

Socket-Programmierung Multithreading Python Client-Server-Architektur OpenWeatherMap API Wetter-App entwickeln TCP-Server Authentifizierung Protokoll Hashing Fehlererkennung Comp 416 Projekt Netzwerkanwendung Anwendungsschicht JSON Dateitransfer Threading in Python API-Integration Tutorial WeatNet Wetter

Einführung: Vom API-Aufruf zur eigenen Wetter-App

Stell dir vor, du entwickelst eine eigene Wetter-App – genau wie die Millionen-Apps auf deinem Smartphone, nur dass du sie selbst programmierst. Genau darum geht es im Comp 416 Projekt: Du baust WeatNet, eine Client/Server-Anwendung, die über die OpenWeatherMap API Wetterdaten abruft und an mehrere Clients verteilt. Klingt kompliziert? Keine Sorge – wir gehen Schritt für Schritt durch die wichtigsten Konzepte: Socket-Programmierung, Multithreading, Authentifizierung und Dateitransfer mit Hashing. Am Ende wirst du verstehen, wie Netzwerkanwendungen auf der Anwendungsschicht funktionieren – und das alles mit einem echten API-Bezug, der dich auf die nächste Coding-Challenge vorbereitet.

Was ist WeatNet? Eine Client/Server-Architektur

WeatNet basiert auf dem klassischen Client/Server-Modell. Der Server holt die Wetterdaten von der OpenWeatherMap API und stellt sie authentifizierten Clients zur Verfügung. Das Besondere: Es gibt zwei TCP-Verbindungen – einen Command Socket für Steuerbefehle und einen Data Socket für den eigentlichen Dateitransfer. Das erinnert an moderne Messaging-Apps, wo ein Kanal für Nachrichten und ein anderer für Dateien genutzt wird. In unserem Fall schickt der Client eine Anfrage (z.B. "aktuelles Wetter für Istanbul") über den Command Socket, der Server lädt die Daten von OWM herunter, berechnet einen Hash zur Fehlererkennung und sendet beides – den Hash über Command, die Datei über Data.

Socket-Programmierung: Die Grundlage jeder Netzwerkkommunikation

Ohne Sockets läuft nichts. Ein Socket ist der Endpunkt einer Netzwerkverbindung. In Python nutzt du das socket-Modul: Der Server erstellt einen welcoming socket, bindet ihn an eine Adresse und wartet auf Clients. Sobald ein Client kommt, akzeptiert der Server die Verbindung und erzeugt einen neuen Socket für die Kommunikation. Das ist wie ein Café, wo ein Türsteher (welcoming socket) die Gäste hereinlässt und dann ein Kellner (connection socket) den Service übernimmt. Für WeatNet brauchst du zwei Sockets pro Client: einen für Befehle, einen für Daten. Das erhöht die Parallelität und macht die Architektur robuster.

Multithreading: Gleichzeitige Clients bedienen

In der echten Welt wollen viele Nutzer gleichzeitig das Wetter wissen. Deshalb setzt WeatNet auf Multithreading. Jeder Client bekommt einen eigenen Thread, der die Authentifizierung und die Datenabfrage abwickelt. So kann der Server mehrere Anfragen parallel bearbeiten – ähnlich wie ein Streamingserver, der tausende Nutzer gleichzeitig versorgt. In Python erreichst du das mit dem threading-Modul: Für jede neue Verbindung startest du einen Thread mit der Funktion handle_client(client_socket). Achte darauf, dass sich die Threads nicht in die Quere kommen – Thread-Sicherheit ist wichtig, wenn mehrere Threads auf gemeinsame Ressourcen zugreifen. Bei WeatNet sind die Ressourcen die API-Calls (maximal 60 pro Minute bei der kostenlosen OWM-Version) und die Dateispeicherung.

Authentifizierung: Sicherer Zugriff nur für berechtigte Clients

Bevor ein Client Daten bekommt, muss er sich ausweisen. Die Authentifizierung erfolgt über ein Frage-Antwort-Spiel: Der Client sendet seinen Benutzernamen, der Server stellt geheime Fragen. Nur wenn alle Antworten korrekt sind, wird die Verbindung freigeschaltet. Das ist wie der Login bei einer Banking-App, nur dass du das Protokoll selbst definierst. Für die Projektarbeit ist das Protokoll vorgegeben – du musst es nur implementieren. Denk dran: Fehlgeschlagene Authentifizierung führt zur sofortigen Trennung. Das testest du am besten mit einem ungültigen Benutzer, um zu sehen, ob dein Server richtig reagiert.

API-Integration: OpenWeatherMap im Einsatz

Die OpenWeatherMap API liefert Wetterdaten in JSON oder als Bild (für Wetterkarten). Du rufst die API mit dem Stadt-ID auf – für die sieben türkischen Städte wie Istanbul (745044) oder Ankara (323784). Die API-Antworten speicherst du als JSON-Dateien auf dem Server. Wichtig: Die kostenlose OWM-Version erlaubt nur 60 API-Calls pro Minute und 1 Million pro Monat. Für die Projekt-Demonstration reicht das, aber du solltest die Calls zählen und ggf. cachen. Ein Tipp: Speichere die Daten lokal und aktualisiere sie nur bei Bedarf – das spart API-Calls und macht die App schneller.

Dateitransfer mit Hashing: Fehlererkennung leicht gemacht

Bevor der Server eine Datei über den Data Socket sendet, berechnet er einen Hash (z.B. SHA256) und schickt diesen über den Command Socket. Der Client empfängt den Hash, dann die Datei, und prüft, ob die Prüfsumme übereinstimmt. Stimmt sie nicht, war die Übertragung fehlerhaft – der Client kann die Datei verwerfen und eine erneute Übertragung anfordern. Das ist wie ein Paketdienst, der vor dem Versand ein Foto des Inhalts macht, damit der Empfänger vergleichen kann. In der Praxis schützt dieser Mechanismus vor Datenkorruption, die durch Netzwerkfehler entstehen kann.

Protokolldesign: Eigenes Protokoll für die Query-Phase

Für die Query-Phase (nach der Authentifizierung) musst du dein eigenes Protokoll entwerfen. Das ist der kreative Teil: Du legst fest, wie der Client seine Anfrage formuliert (z.B. "CURRENT Istanbul" oder "FORECAST 7 Ankara") und wie der Server antwortet. Ein einfaches textbasiertes Protokoll reicht – ähnlich wie HTTP, aber schlanker. Dokumentiere dein Protokoll im Projektbericht, denn das gehört zur Bewertung. Ein Tipp: Orientiere dich am Authentifizierungsprotokoll, das bereits vorgegeben ist, und erweitere es um Befehle für die verschiedenen Wetterdaten-Typen (aktuell, 7-Tage, minütlich, historisch, Karten).

Praxistipp: Testen mit mehreren Clients

Um die Multithreading-Fähigkeit zu demonstrieren, starte mehrere Client-Instanzen gleichzeitig (z.B. in verschiedenen Terminal-Fenstern). Jeder Client sollte sich authentifizieren und dann unterschiedliche Wetterdaten anfordern. Beobachte, ob der Server alle Anfragen parallel bedient und ob die Dateien korrekt übertragen werden. Ein typischer Fehler ist, dass die Data Sockets nicht richtig zugeordnet werden – achte darauf, dass für jeden Client ein eigener Data Socket erstellt wird. Teste auch den Fehlerfall: Ein Client mit falschem Passwort sollte abgewiesen werden, während andere weiterarbeiten.

Zusammenfassung: Was du gelernt hast

Mit diesem Tutorial hast du einen tiefen Einblick in die Anwendungsschicht des Netzwerk-Stacks bekommen. Du kennst jetzt die Grundlagen der Socket-Programmierung, Multithreading und API-Integration am Beispiel einer Wetter-App. Du kannst einen eigenen Server schreiben, der Clients authentifiziert, Daten von einer externen API holt und sie sicher über zwei TCP-Verbindungen überträgt. Das sind Fähigkeiten, die du für jede Netzwerkanwendung brauchst – sei es ein Chat-Server, ein Datei-Sharing-Dienst oder eine Echtzeit-Datenplattform. Die nächste Herausforderung: Erweitere WeatNet um eine grafische Oberfläche oder eine Web-Schnittstelle – dann hast du eine vollwertige Wetter-App in der Hand.