Internet-Kommunikation in Python mit Sockets



Ähnliche Dokumente
Internet-Kommunikation in Python mit Sockets

Python Programmierung. Dipl.-Ing.(FH) Volker Schepper

Anwendungsprotokolle: HTTP, POP, SMTP

ARCHITEKTUR VON INFORMATIONSSYSTEMEN

FOPT 5: Eigenständige Client-Server-Anwendungen (Programmierung verteilter Anwendungen in Java 1)

Transmission Control Protocol (TCP)

2.3 Applikationen. Protokolle: TCP/IP. Telnet, FTP, Rlogin. Carsten Köhn

KN Das Internet

Internet und WWW Übungen

Rechnernetze Übung 12

2. Kommunikation und Synchronisation von Prozessen 2.2 Kommunikation zwischen Prozessen

. Nachrichtenübertragung. Internetkommunikation Christof Fox. Wie werden Nachrichten Übertragen?

IMAP und POP. Internet Protokolle WS 12/13 Niklas Teich Seite 1

Einrichten eines Postfachs mit Outlook Express / Outlook bis Version 2000

15 Transportschicht (Schicht 4)

Protokolle. Konrad Rosenbaum, 2006/7 protected under the GNU GPL & FDL

Dialup Verbindung und Smarthost einsetzen

Rechnernetzwerke. Rechnernetze sind Verbünde von einzelnen Computern, die Daten auf elektronischem Weg miteinander austauschen können.

4. Network Interfaces Welches verwenden? 5. Anwendung : Laden einer einfachen Internetseite 6. Kapselung von Paketen

Man liest sich: POP3/IMAP

Schritt 2: Konto erstellen

Client/Server-Systeme

Client-Server mit Socket und API von Berkeley

Einrichtung eines -konto mit Outlook Express

Benutzerhandbuch für Debian Server mit SAMBA. Rolf Stettler Daniel Tejido Manuel Lässer

Gefahren aus dem Internet 1 Grundwissen April 2010

Schichtenmodell. Informatik Fortbildung Kommunikation in Rechnernetzen. IFB Speyer November Dr. Michael Schlemmer

LOG-FT BAG Filetransfer zum Austausch mit dem Bundesamt für Güterverkehr (BAG) Kurzanleitung

Switching. Übung 7 Spanning Tree. 7.1 Szenario

Wenn Cygwin standardmässig installiert wurde befindet es sich unter C:\cygwin

Anleitung zur Nutzung des SharePort Utility

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

Vorlesung SS 2001: Sicherheit in offenen Netzen

Anbindung des eibport an das Internet

Bitte beachten Sie. Nur für Kabelmodem! - 1 -

Kurzanleitung SEPPmail

Schritt 1: Auswahl Schritt 3 Extras > Konten Schritt 2: Konto erstellen Konto hinzufügen klicken

OP-LOG

Programmieren II. Timer. Vorlesung 11. Handout S. 1. Martin Schultheiß. Hochschule Darmstadt Sommersemester Timer. Sockets.

Schritt 1: Auswahl Schritt 3 Extras > Konten Schritt 2: Konto erstellen Konto hinzufügen klicken

Web Interface für Anwender

Vorlesung SS 2001: Sicherheit in offenen Netzen

HTBVIEWER INBETRIEBNAHME

Helmut Kleinschmidt. Pflicht ab

POP3 über Outlook einrichten

Themen. Anwendungsschicht DNS HTTP. Stefan Szalowski Rechnernetze Anwendungsschicht

12. Kieler OpenSource und Linux Tage. Wie funktioniert eigentlich Mail? , Frank Agerholm, Linux User Group Flensburg e.v.

Einrichtung eines -Kontos bei MS Office Outlook 2010 (Windows) Stand: 03/2011

Übersicht. Was ist FTP? Übertragungsmodi. Sicherheit. Öffentliche FTP-Server. FTP-Software

Bitte beachten Sie. Nur für Kabelmodem! - 1 -

MSXFORUM - Exchange Server 2003 > SMTP Konfiguration von Exchange 2003

Konfigurationsanleitung Access Control Lists (ACL) Funkwerk. Copyright Stefan Dahler Oktober 2008 Version 1.0.

6 Hub Transport Server 6.1 Grundlagen des Message-Routing

anleitung für einen 2Wire- Account im Microsoft Outlook 2007

Einrichtung eines -konto mit Thunderbird

Anleitung zum Prüfen von WebDAV

Programmiermethodik. Übung 13

Local Control Network Technische Dokumentation

Themen. Transportschicht. Internet TCP/UDP. Stefan Szalowski Rechnernetze Transportschicht

TeamSpeak3 Einrichten

Bitte beachten Sie. Nur für Kabelmodem! - 1 -

Um DynDNS zu konfigurieren, muss ausschließlich folgendes Menü konfiguriert werden:

Stefan Dahler. 1. Remote ISDN Einwahl. 1.1 Einleitung

Bitte beachten Sie. Nur für Kabelmodem! - 1 -

Herzlich Willkommen bei der nfon GmbH

Anlegen eines Nebennutzers an der e Vergabe 5.0

EDI Datenaustausch und Konvertierung Funktionsumfang & Services

POP3 und SMTP live und schwarzweiß

Kontrollfragen Die nötigen Netzwerkgrundlagen

Rechnernetze. 6. Übung

Einrichtung eines -Kontos bei MS Office Outlook 2007 (Windows) Stand: 03/2011

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Benutzerhandbuch. Leitfaden zur Benutzung der Anwendung für sicheren Dateitransfer.

POP3-Protokoll Eine kurze Erklärung. Johannes Mayer SAI, Universität Ulm Juni 2001

Step by Step Remotedesktopfreigabe unter Windows Server von Christian Bartl

Dieses HowTo darf nicht vervielfältigt oder veröffentlich werden ohne Einverständnis des Erstellers. Alle Angaben ohne Gewähr.

Serviceanweisung Austausch Globalsign Ausstellerzertifikate

Uni-Firewall. Absicherung des Überganges vom Hochschulnetz zum Internet am Wingate (Helmut Celina)

Bitte beachten Sie. Nur für Kabelmodem! - 2 -

Was ist SASL? Simple Authentication and Security Layer

Online-Publishing mit HTML und CSS für Einsteigerinnen

Anwendungshinweis Nr. 12. Wie konfiguriere ich redundante Serververbindungen

EINRICHTUNG DER FANUC-MERCATOR- SCHNITTSTELLE

Dokumentation FileZilla. Servermanager

Bernd Blümel. Verschlüsselung. Prof. Dr. Blümel

ICS-Addin. Benutzerhandbuch. Version: 1.0

Kurzanleitung zum Einrichten von konten für Outlook Express 6

Betriebskonzept Einrichtung

Handout Wegweiser zur GECO Zertifizierung

GeODin 7 Installationsanleitung

Beispiel Zugangsdaten -Konto

Kommunikations-Parameter

Voraussetzungen für die Nutzung der Format Rechenzentrumslösung (Hosting)

MC-Hx 006. Einbindung des MC-Hx Modul als MODBus TCP Slave. MB DataTec GmbH. Stand:

System-Update Addendum

Switching. Übung 9 EAP 802.1x. 9.1 Szenario

Schritt-für-Schritt-Anleitung So verschlüsseln Sie Ihr -Konto in der Software 6.0

Anleitung Grundsetup C3 Mail & SMS Gateway V

TCP/IP-Protokollfamilie

Transkript:

Internet-Kommunikation in Python mit Sockets Dr. Michael Savorić Hohenstaufen-Gymnasium (HSG) Kaiserslautern Version 20140510

Überblick Internet-Schichtenmodell Grundlagen der Internet-Kommunikation Internet-Transportprotokolle: UDP und TCP Sockets in Python: socket-modul Kurs-Konventionen UDP-Beispiele und Übungen TCP-Beispiele und Übungen Weitere Übungen Spezielle Themen, Ausblick, Anhang Literatur M. Savorić 2

Internet-Schichtenmodell Schicht 5 Anwendungsschicht z.b. HTTP, FTP, SMTP Schicht 4 Transportschicht z.b. UDP, TCP Schicht 3 Netzwerkschicht z.b. IP, Routing, Forwarding Schicht 2 Sicherungsschicht z.b. 802.X (Ethernet, WLAN) Schicht 1 Bitübertragungsschicht z.b. 802.X PHY M. Savorić 3

Grundlagen der Internet-Kommunikation (1/2) Jeder Rechner im Internet besitzt mindestens eine IP- Adresse, z.b. 10.221.90.155 (IPv4, 32 Bit) Ein Rechner besitzt Portnummern (kurz: Ports) im Bereich 0...65535 (16 Bit) Eine Kommunikation zwischen zwei Rechnern A und B (genauer: zwischen Prozessen auf diesen Rechnern) benötigt die IP-Adressen der beteiligten Rechner sowie die Ports: A(IP-Adresse, Port) B(IP-Adresse, Port) M. Savorić 4

Grundlagen der Internet-Kommunikation (2/2) Bestimmte Ports sind reserviert für besondere standardisierte Dienste, z.b.: Dienst Telnet FTP HTTP SMTP Port 23 20, 21 80 25 Jeder kann eigene Dienste im Netz anbieten, es muss nur der Port für diesen Dienst bekannt sein! Dienstanbieter (Server) Dienstbenutzer (Client) M. Savorić 5

Sockets im Internet-Schichtenmodell Schicht 5 Schicht 4 Anwendungsschicht Sockets Transportschicht z.b. HTTP, FTP, SMTP z.b. UDP, TCP Schicht 3 Netzwerkschicht z.b. IP, Routing, Forwarding Schicht 2 Sicherungsschicht z.b. 802.X (Ethernet, WLAN) Schicht 1 Bitübertragungsschicht z.b. 802.X PHY M. Savorić 6

Grundlagen der Internet-Kommunikation mit Sockets (1/3) Ein Socket ist eine Schnittstelle zwischen einem Programm bzw. Prozess und den vom Betriebssystem angebotenen Kommunikationsprotokollen der Transportschicht Über den Socket läuft die Kommunikation mit dem anderen Rechner (genauer: mit einem Prozess auf dem anderen Rechner) Sockets bieten vielfältige Operationen an, verbergen dabei die Komplexität der Kommunikation M. Savorić 7

Grundlagen der Internet-Kommunikation mit Sockets (2/3) Rechner A: Rechner B: Prozess Prozess Socket Socket Transportschicht Nachrichten der Transportschicht Transportschicht Nachrichten der Transportschicht sind eingepackt in Pakete und Rahmen der unterliegenden Schichten M. Savorić 8

Grundlagen der Internet-Kommunikation mit Sockets (3/3) Für eine Kommunikation über das Internet stehen im wesentlichen zwei Kommunikationsprotokolle der Transportschicht (= Transportprotokolle) zur Verfügung: UDP und TCP Abhängig vom gewählten Transportprotokoll UDP bzw. TCP gestaltet sich die Kommunikation mit Sockets unterschiedlich (siehe Beispiele) M. Savorić 9

UDP (User Datagram Protocol) Eigenschaften: verbindungslos keine eingebaute Fehlerkorrektur Kommunikationsprinzip: Sofortige Datenübertragung ohne Vor- und Nacharbeiten Verwendung: Echtzeit-Video oder Echtzeit-Audio (VoIP)... M. Savorić 10

Schematische Kommunikation bei UDP Client: Server: Daten verarbeiten Socket erzeugen Daten senden... Daten empfangen Socket schließen Daten verarbeiten Client-Adresse, Daten Server-Adresse, Daten Socket erzeugen Socket binden... Daten empfangen Daten verarbeiten Daten senden Socket schließen Socket binden = IP-Adresse und Port des Sockets festlegen M. Savorić 11

TCP (Transmission Control Protocol) Eigenschaften: verbindungsorientiert eingebaute Fehlerkorrektur (Quittungsbetrieb) Fluss- und Überlastkontrolle Kommunikationsprinzip: Verbindungsaufbau, Datenübertragung, Verbindungsabbau Verwendung: HTTP, FTP... M. Savorić 12

Schematische Kommunikation bei TCP Client: Server: Daten verarbeiten Socket erzeugen Verbindung anfragen... Daten senden... Daten empfangen... Socket schließen Daten verarbeiten Client-Adresse Server-Adresse Daten Daten Ende Ende Socket erzeugen Socket binden Socket beobachten Verbindung akzeptieren... Daten empfangen Daten verarbeiten Daten senden... Socket schließen M. Savorić 13

Sockets in Python: socket-modul (1/2) Einbinden des socket-moduls: Variante 1 (am Beispiel eines UDP-Sockets): import socket Protokollfamilie client_socket = socket.socket(socket.af_inet, socket.sock_dgram) Variante 2 (am Beispiel eines UDP-Sockets): from socket import * Protokollart client_socket = socket(af_inet, SOCK_DGRAM) M. Savorić 14

Sockets in Python: socket-modul (2/2) Überblick der im socket-modul vorhandenen Befehle und Variablen: import socket dir(socket) Hilfe zu Befehlen des socket-moduls, z.b.: import socket help(socket.socket) M. Savorić 15

Nützliche Funktionen im socket-modul von Python Name des eigenen Rechners: socket.gethostname() IP-Adresse des eigenen Rechners: socket.gethostbyname(socket.gethostname()) IP-Adresse eines anderen Rechners, z.b.: socket.gethostbyname( www.hsg-kl.de ) Name eines Rechners, z.b.: socket.gethostbyaddr( 10.221.90.155 ) M. Savorić 16

Konventionen für diesen Kurs Wir werden Textnachrichten zwischen Prozessen auf den beteiligten Rechnern austauschen Über unsere Sockets werden jeweils nur Folgen von Bytes (Byteströme) übertragen Wir benötigen daher Funktionen, die aus einem beliebigen Text einen Bytestrom bzw. aus einem Bytestrom einen Text erzeugen M. Savorić 17

Erklärung für diese Konventionen Rechner können für gleiche Datentypen unterschiedliche Speicherformate haben, z.b. das Big-Endian- oder Low-Endian- Format bei Ganzzahl-Datentypen, die länger als ein Byte sind Text kann unterschiedlich kodiert sein, z.b. ASCII, CP1252, UTF-8 Bei der Übertragung von Datentypen- oder Text-Nachrichten zwischen Rechnern müssen diese möglichen Unterschiede immer beachtet werden erhöhter Programmieraufwand Bei der Übertragung von Byteströmen gibt es keine Probleme! M. Savorić 18

Netzdarstellung und Hostdarstellung von Integer-Zahlen Die Netzdarstellung ist Big-Endian, die Hostdarstellung bei z.b. 80x86-PCs Low-Endian, bei vielen Großrechnern Big- Endian Hostdarstellung Netzdarstellung, z.b.: socket.htons(42) 10752 # zwei Byte socket.htonl(42) 704643072 # vier Byte Netzdarstellung Hostdarstellung: socket.ntohs(10752) 42 socket.ntohl(704643072) 42 M. Savorić 19

Konvertierungen String Bytestrom in Python String Bytestrom: Die Funktion string2bytes(text) wandelt einen Text in einen Bytestrom Bytestrom String: Die Funktion bytes2string(bytes) wandelt einen Bytestrom in einen Text Implementiert im eigenen Modul kodierung (kodierung.py) M. Savorić 20

kodierung-modul (Auszug) import sys def byteorder(): return sys.byteorder def standard_encoding(): return sys.getdefaultencoding() def standardausgabe_encoding(): return sys.stdout.encoding def string2bytes(text): return bytes(text, "utf8") def bytes2string(bytes): return str(bytes, "utf8") M. Savorić 21

Hinweise zu den Konvertierungs-Funktionen Keine Probleme: Beim Verwenden in eigenen Socket-Anwendungen auf Senderund Empfängerseite Bei vielen standardisierten Socket-Anwendungen Probleme: Bei manchen Socket-Anwendungen, wenn andere Textkodierungen als UTF-8 verlangt bzw. geliefert werden Lösung: Im Problemfall entsprechende Textkodierung verwenden M. Savorić 22

Beispiele: Einbinden der Module socket und kodierung socket-modul: import socket kodierung-modul: from kodierung import string2bytes, bytes2string Gründe: Befehle des socket-moduls im Quelltext kenntlich machen Quelltextzeilen nicht zu lang werden lassen M. Savorić 23

UDP-Beispiel 1: Client für den Daytime-Dienst server_addr = ( time.fu-berlin.de, 13) client_socket = socket.socket(socket.af_inet, socket.sock_dgram) client_socket.sendto(string2bytes( ), server_addr) daten, addr = client_socket.recvfrom(1024) datenstring = bytes2string(daten) client_socket.close() del client_socket print(datenstring) Daytime-Server benötigen keine Nachricht vom Client M. Savorić 24

UDP-Beispiel 1: Server für den Daytime-Dienst server_socket = socket.socket(socket.af_inet, socket.sock_dgram) server_socket.bind((socket.gethostbyname(socket.gethostname()), 13)) while True: daten, addr = server_socket.recvfrom(1024) datenstring =... # String mit der aktuellen Uhrzeit server_socket.sendto(string2bytes(datenstring), addr) server_socket.close() del server_socket Socket binden an Port 13 M. Savorić 25

UDP-Beispiel 2: Server für einen eigenen Echo-Dienst server_socket = socket.socket(socket.af_inet, socket.sock_dgram) server_socket.bind((socket.gethostbyname(socket.gethostname()), 0)) eigene_portnummer = server_socket.getsockname()[1] print("\nwarte auf Anfragen an Port %5i.\n" % (eigene_portnummer)) while True: daten, addr = server_socket.recvfrom(1024) datenstring = bytes2string(daten) server_socket.sendto(string2bytes(datenstring), addr) server_socket.close() del server_socket Socket binden an einen vom System gewählten Port M. Savorić 26

Übungen mit UDP Übung 1: Schreiben Sie einen Client für den Echo-Dienst und testen Sie ihn mit dem vorbereiteten Echo-Server. Übung 2: Schreiben Sie einen Client und einen Server für einen Zeichenzähl-Dienst. Übung 3: Schreiben Sie einen Client und einen Server für einen Dienst Ihrer Wahl. M. Savorić 27

TCP-Beispiel 1: Client für den Daytime-Dienst server_addr = ( time.fu-berlin.de, 13) client_socket = socket.socket(socket.af_inet, socket.sock_stream) client_socket.connect(server_addr) daten = client_socket.recv(1024) datenstring = bytes2string(daten) client_socket.close() del client_socket print(datenstring) Daytime-Server benötigen keine Nachricht vom Client M. Savorić 28

TCP-Beispiel 1: Server für den Daytime-Dienst server_socket = socket.socket(socket.af_inet, socket.sock_stream) server_socket.bind((socket.gethostbyname(socket.gethostname()), 13)) while True: server_socket.listen(5) Socket beobachten client_serving_socket, addr = server_socket.accept() datenstring =... # String mit der aktuellen Uhrzeit client_serving_socket.send(string2bytes(datenstring)) client_serving_socket.close() del client_serving_socket server_socket.close() del server_socket Socket für die Client-Bedienung erzeugen M. Savorić 29

TCP-Beispiel 2: Server für einen eigenen Echo-Dienst server_socket = socket.socket(socket.af_inet, socket.sock_stream) server_socket.bind((socket.gethostbyname(socket.gethostname()), 0)) eigene_portnummer = server_socket.getsockname()[1] print("\nwarte auf Anfragen an Port %5i.\n" % (eigene_portnummer)) while True: server_socket.listen(5) client_serving_socket, addr = server_socket.accept() daten = client_serving_socket.recv(1024) datenstring = bytes2string(daten) client_serving_socket.send(string2bytes(datenstring)) client_serving_socket.close() del client_serving_socket server_socket.close() del server_socket M. Savorić 30

Übungen mit TCP Übung 1: Schreiben Sie einen Client für den Echo-Dienst und testen Sie ihn mit dem vorbereiteten Echo-Server. Übung 2: Schreiben Sie einen Client und einen Server für einen Quersummen-Dienst. M. Savorić 31

Weitere Übungen (1/3) Übung 1: Schreiben Sie einen Client und einen Server für eine Bankanwendung, die für ein Bankkonto Einzahlungen, Auszahlungen (falls möglich!) und Ermittlungen des aktuellen Kontostands erlaubt. Überlegen Sie sich dafür ein geeignetes Protokoll und passende Protokollnachrichten (siehe Anhang) sowie sinnvolle Einbzw. Ausgaben beim Client und beim Server. M. Savorić 32

Weitere Übungen (2/3) Übung 2: Schreiben Sie einen Client und einen Server für das bekannte Zahlenratespiel, so dass Sie dieses Spiel ab sofort auch über das Internet spielen können. Auch hier müssen Sie sich ein geeignetes Protokoll und passende Protokollnachrichten (siehe Anhang) überlegen. Mögliche Erweiterungen: Rateversuche mitzählen und mitteilen Schwierigkeitsgrad vor dem Raten auswählen Spiel abbrechen... M. Savorić 33

Weitere Übungen (3/3) Übung 3: Schreiben Sie einen Client und einen Server für die Übertragung einer (textbasierten, binären oder beliebigen) Datei. Übung 4: Schreiben Sie einen Client und einen Server für die Übertragung einer Liste oder eines anderen Python- Objekts (Hinweis: das pickle-modul in Python bietet passende Funktionen an). M. Savorić 34

Spezielles: Fehlerverarbeitung bei Sockets (1/2) Bei der Kommunikation mit Sockets sind viele Fehlerquellen möglich, z.b. ein nicht antwortender Server oder eine nicht vorhandene Verbindung mit dem Internet. Verwendung des Try-Except-Mechanismus, z.b.: try: client_socket = socket.socket(socket.af_inet, socket.sock_dgram)... del client_socket except socket.error as err: print("fehlernummer: %i, Fehlerbeschreibung: %s" % (err.errno, err.strerror)) sys.exit(1) M. Savorić 35

Spezielles: Fehlerverarbeitung bei Sockets (2/2) Der try-except-mechanismus kann um jeden einzelnen Socket-Befehl verwendet werden, um geeignet auf bestimmte mögliche Fehler bei der Kommunikation reagieren zu können Reine Fehlerausgaben reichen in der Praxis nicht aus M. Savorić 36

Ausblick (1/3) Fehler bei Socket-Anwendungen absichtlich herbeiführen und geeignet darauf reagieren Clients für standardisierte Dienste schreiben, z.b.: SMTP (Beispiel-Protokollablauf und Client siehe Anhang) HTTP (Beispiel-Protokollablauf und Client siehe Anhang) Nachhaltiger Lerneffekt für die ausgewählten Protokolle und die Programmierung von Socket-Anwendungen Hinweis: Python bietet bereits Methoden zur einfachen Verwendung von Standard-Internet-Diensten an, z.b. das Modul urllib für HTTP M. Savorić 37

Ausblick (2/3) Implementierung von Protokollmechanismen anderer Schichten mit UDP, z.b. ein einfacher Quittungsbetrieb aus der Schicht 2 (Alternating-Bit-Protocol): Datenpakete mit alternierender Sequenznummer (0 oder 1) Datenpaket mit aktueller Sequenznummer senden und Timer für den Sender starten Auf Timeout beim Sender reagieren (Wiederholungsübertragung, Anzahl der Wiederholungsübertragungen zählen, eventuell Senden abbrechen,...) Auf Quittung beim Sender reagieren (Sequenznummer anpassen, neues Datenpaket senden, Senden beenden,...) M. Savorić 38

Ausblick (3/3) Chatprogramm (LK-Miniprojekt): Protokoll und zusätzliche Dinge (gültige Login-Namen, gültige Nachrichten,...) für die Kommunikation entwickeln und Alternativen diskutieren (alle gemeinsam an der Tafel, Ergebnis siehe Anhang) Chat-Server schreiben (ein oder zwei Schüler) Chat-Client schreiben (jeder andere Schüler jeweils selbst) Tests M. Savorić 39

M. Savorić 40 Anhang

Protokollnachrichten des vorbereiteten Bank-Servers Kommunikation: Client Server bzw. Client Server Kontostand ermitteln: = OK +str(kontostand) Einzahlung: + +str(betrag) OK Auszahlung: - +str(betrag) OK oder ER M. Savorić 41

Protokollnachrichten des vorbereiteten Zahlenratespiel-Servers Kommunikation: Client Server bzw. Client Server Raten: str(versuch) - oder + oder = Bedeutung der Server-Nachrichten: - : die gesuchte Zahl ist kleiner + : die gesuchte Zahl ist größer = : die gesuchte Zahl ist gleich M. Savorić 42

Einige standardisierte Dienste bzw. Protokolle im Internet Simple Mail Transfer Protocol (SMTP): Verschicken von E-Mails TCP an Port 25 Post Office Protocol (POP): Empfangen und Verwalten von E-Mails TCP an Port 110 bzw. 995 (verschlüsselt) Hypertext Transfer Protocol (HTTP): Anfordern von Webseiten TCP an Port 80 M. Savorić 43

SMTP-Beispielkommunikation (aus RFC 5321) S: 220 foo.com Simple Mail Transfer Service Ready C: EHLO bar.com S: 250-foo.com greets bar.com S: 250-8BITMIME S: 250-SIZE S: 250-DSN S: 250 HELP C: MAIL FROM:<JQP@bar.com> S: 250 OK C: RCPT TO:<Jones@XYZ.COM> S: 250 OK C: DATA S: 354 Start mail input; end with <CRLF>.<CRLF> C: Date: Thu, 21 May 1998 05:33:29-0700 C: From: John Q. Public <JQP@bar.com> C: Subject: The Next Meeting of the Board C: To: Jones@xyz.com C: C: Bill: C: The next meeting of the board of directors will be C: on Tuesday. C: John. C:. S: 250 OK C: QUIT S: 221 foo.com Service closing transmission channel EHLO = Extended Hello HELO = Hello S = Server, C = Client M. Savorić 44

SMTP-Client (1/3) import socket from kodierung import string2bytes, bytes2string smtp_client_socket = socket.socket(socket.af_inet, socket.sock_stream) smtp_client_socket.bind((socket.gethostbyname(socket.gethostname()), 0)) smtp_server_ip_adresse = socket.gethostbyname("mail.hsg-kl.de") smtp_server_portnummer = 25 smtp_client_socket.connect((smtp_server_ip_adresse, smtp_server_portnummer)) smtp_client_socket.send(string2bytes("helo sesamstrasse.de\n")) data = bytes2string(smtp_client_socket.recv(1024)) M. Savorić 45

SMTP-Client (2/3) smtp_client_socket.send(string2bytes("mail FROM:<msavoric@t-online.de>\n")) data += bytes2string(smtp_client_socket.recv(1024)) smtp_client_socket.send(string2bytes("rcpt TO:<msavoric@t-online.de>\n")) data += bytes2string(smtp_client_socket.recv(1024)) smtp_client_socket.send(string2bytes("data\n")) data += bytes2string(smtp_client_socket.recv(1024)) smtp_client_socket.send(string2bytes("date: wird nicht verraten\n")) smtp_client_socket.send(string2bytes("from: <grafzahl@sesamstrasse.de>\n")) smtp_client_socket.send(string2bytes("subject: Hallo\n")) smtp_client_socket.send(string2bytes("to: <msavoric@t-online.de>\n\n")) M. Savorić 46

SMTP-Client (3/3) smtp_client_socket.send(string2bytes("hallo,\nwie geht es Dir?\n\nGrüße vom Grafen\n")) smtp_client_socket.send(string2bytes("\n.\n")) data += bytes2string(smtp_client_socket.recv(1024)) smtp_client_socket.send(string2bytes("quit\n")) data += bytes2string(smtp_client_socket.recv(1024)) smtp_client_socket.close() del smtp_client_socket print(data) M. Savorić 47

Beispielausgabe des SMTP-Clients 220 spielwiese.hsg-kl.de ESMTP 250 spielwiese.hsg-kl.de 250 2.1.0 Ok 250 2.1.5 Ok 354 End data with <CR><LF>.<CR><LF> 250 2.0.0 Ok: queued as 2768312E174 M. Savorić 48

HTTP: Anforderung einer Datei (siehe Wikipedia-Artikel) Beispiel-HTTP-Server: www.example.net Beispiel-Datei: infotext.html Anforderung an den HTTP-Server: GET /infotext.html HTTP/1.1 Host: www.example.net Wichtig: Leerzeile nach der GET-Anforderung M. Savorić 49

HTTP-Client (1/3) import socket, string from kodierung import string2bytes, bytes2string client_socket = socket.socket(socket.af_inet, socket.sock_stream) print("\neigener Rechner: %s (%s)\n" % (socket.gethostname(), socket.gethostbyname(socket.gethostname()))) http_server = "www.hsg-kl.de" http_server_ip_adresse = socket.gethostbyname(http_server) http_server_portnummer = 80 print("hole WWW-Startseite von: %s (%s)\n" % (http_server, http_server_ip_adresse)) client_socket.connect((http_server_ip_adresse, http_server_portnummer)) M. Savorić 50

HTTP-Client (2/3) anfrage = "GET / HTTP/1.1\nHOST: "+http_server+"\n\n" client_socket.send(string2bytes(anfrage)) daten = "" Anfordern der WWW-Startseite while True: block = client_socket.recv(1024) if not block: break else: daten = daten+str(block, "iso-8859-1") # daten+bytes2string(block) # scheitert wegen der # ISO-8859-1-Kodierung # der Webseite client_socket.close() del client_socket M. Savorić 51

HTTP-Client (3/3) grenze = daten.find("<") if grenze == -1: print("fehler bei der Übertragung!\n") else: print("http-overhead:\n"+"--------------\n"+daten[:grenze-1]+"\n") print("http-inhalt:\n"+"------------\n"+daten[grenze:]+"\n") M. Savorić 52

Beispielausgabe des HTTP-Clients Eigener Rechner: Helferlein2 (10.211.112.51) Hole WWW-Startseite von: www.hsg-kl.de (131.246.120.81) HTTP-Overhead: -------------- HTTP/1.1 200 OK Content-Length: 4525 Date: Fri, 22 Oct 2010 01:48:36 GMT Server: Apache/2.2.9 (Debian) mod_fastcgi/2.4.6 PHP/5.2.6-1+lenny9 with Suhosin-Patch mod_python/3.3.1 Python/2.5.2 X-Powered-By: PHP/5.2.6-1+lenny9 Content-Type: text/html Connection: keep-alive HTTP-Inhalt: ------------ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"... M. Savorić 53

Chatprogramm Das Protokoll (Tafelbild) M. Savorić 54

Chatprogramm Das Protokoll Anmeldung (Client und Server): /login Aliasname\0 /error\0 oder /ok Aliasname1\nAliasname2\n...\0 Abmeldung (Client und Server): /logout\0 /error\0 oder /ok\0 Chatten (Client): Nachricht + \0 Verteilen (Server): Aliasname: + Nachricht + \0 teilnehmende Chatter (Client und Server): /users\0 /users Aliasname1\nAliasname2\n...\0 erlaubtes Alphabet: [a-z,a-z,0-9,_,-] M. Savorić 55

Literatur Internet-Recherche (Wikipedia,...) RFC 5321, 2008 Eigene Unterlagen M. Summerfield, Programming in Python 3, Addison- Wesley, 2009, ISBN-13: 978-0-13-712929-4, 44.99 $ M. Savorić 56