Internet-Kommunikation in Python mit Sockets



Ähnliche Dokumente
Internet-Kommunikation in Python mit Sockets

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

ARCHITEKTUR VON INFORMATIONSSYSTEMEN

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

Anwendungsprotokolle: HTTP, POP, SMTP

15 Transportschicht (Schicht 4)

Transmission Control Protocol (TCP)

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

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

2. Kommunikation und Synchronisation von Prozessen 2.2 Kommunikation zwischen Prozessen

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

Anleitung zum Prüfen von WebDAV

Client-Server mit Socket und API von Berkeley

KN Das Internet

Man liest sich: POP3/IMAP

Rechnernetze Übung 12

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

MSXFORUM - Exchange Server 2003 > SMTP Konfiguration von Exchange 2003

Anbindung des eibport an das Internet

Einrichtung eines -konto mit Thunderbird

Online-Publishing mit HTML und CSS für Einsteigerinnen

EINRICHTUNG DER FANUC-MERCATOR- SCHNITTSTELLE

Dialup Verbindung und Smarthost einsetzen

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

Internet und WWW Übungen

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

TK-Schnittstelleneinrichtung. Redundante Softswitches

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Client/Server-Systeme

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

Vorlesung SS 2001: Sicherheit in offenen Netzen

[DvBROWSER] Offline-Viewer für [DvARCHIV] und [DvARCHIVpersonal] Version 2.2

Folgende Voraussetzungen für die Konfiguration müssen erfüllt sein: - Ein Bootimage ab Version Optional einen DHCP Server.

Enigmail Konfiguration

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Externe Abfrage von für Benutzer der HSA über Mozilla-Thunderbird

Benutzerhandbuch - Elterliche Kontrolle

Schritt 2: Konto erstellen

Einführung in die Netzwerktechnik

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

Gefahren aus dem Internet 1 Grundwissen April 2010

Einrichten eines Postfachs mit Outlook Express / Outlook bis Version 2000

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

Unified Communication Client Installation Guide

Informationen als Leistung

SMS/ MMS Multimedia Center

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

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

Einrichtung eines -konto mit Outlook Express

Installation Terminkarten- und Etikettendrucker

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

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

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

Internet online Update (Mozilla Firefox)

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

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

Sie können diesen Service verwenden, um fast beliebig große Dateien auch über 2 GB zu versenden.

Kontrollfragen: Internet

teamsync Kurzanleitung

Was ist SASL? Simple Authentication and Security Layer

Sichere Anleitung Zertifikate / Schlüssel für Kunden der Sparkasse Germersheim-Kandel. Sichere . der

TCP/IP Protokollstapel

Inhaltverzeichnis 1 Einführung Zugang zu den Unifr Servern Zugang zu den Druckern Nützliche Links... 6

POP3 und SMTP live und schwarzweiß

Funktionale Programmierung mit Haskell

SMS-API. Sloono Schnittstellenbeschreibung. Version 1.2 Stand

Vorlesung SS 2001: Sicherheit in offenen Netzen

Themen. Anwendungsschicht DNS HTTP. Stefan Szalowski Rechnernetze Anwendungsschicht

Webseiten mit fragwürdigen Aufrufen von "spy & track" - Unternehmen

Dokumentation zur Versendung der Statistik Daten

anleitung für einen NETVS- Account im Microsoft Outlook 2007

Installation der Eicon Diva PCI Karte unter Windows XP

DNÜ-Tutorium HS Niederrhein, WS 2014/2015. Probeklausur

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

Arbeitsgruppen innerhalb der Website FINSOZ e.v.

3 Konfiguration OfficeMaster 3.10 SNMP

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Web Grundlagen zum Spidering

Kommunikation im Netzwerk

DELFI. Benutzeranleitung Dateiversand für unsere Kunden. Grontmij GmbH. Postfach Bremen. Friedrich-Mißler-Straße Bremen

Routing im Internet Wie findet ein IP Paket den Weg zum Zielrechner?

HTBVIEWER INBETRIEBNAHME

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

Installation OMNIKEY 3121 USB

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

NODELOCKED LIZENZ generieren (ab ST4)

Handbuch Amos Ersteller: EWERK MUS GmbH Erstellungsdatum:

Widerrufsbelehrung der Free-Linked GmbH. Stand: Juni 2014

User Manual Data 24. Login und Layout

Transition vom heutigen Internet zu IPv6

Alarmbilder von Bildquellen per empfangen

Schlüsselaustausch. Version 1.1. APCS Power Clearing and Settlement AG

STRATO Mail Einrichtung Mozilla Thunderbird

Anleitung für die Hausverwaltung

STRATO Mail Einrichtung Android 4.4

Kontakte Dorfstrasse 143 CH Kilchberg Telefon 01 / Telefax 01 / info@hp-engineering.com

Arbeitsblätter. Sinnvolle Finanzberichte. Seite 19

OP-LOG

Transkript:

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

Ü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 Schicht 4 Transportschicht z.b. UDP, TCP Schicht 3 Netzwerkschicht z.b. IP, Routing, Forwarding Schicht 2 Sicherungsschicht z.b. 802.X Schicht 1 Bitübertragungsschicht z.b. 802.X PHY M. Savorić 3

Grundlagen der Internet-Kommunikation (1/2) Jeder Rechner im Internet besitzt 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 z.b. UDP, TCP Schicht 3 Netzwerkschicht z.b. IP, Routing, Forwarding Schicht 2 Sicherungsschicht z.b. 802.X 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 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: import socket client_socket = socket.socket(socket.af_inet, socket.sock_dgram) Variante 2: from socket import * 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. Big-Endian- oder Low-Endian-Format bei 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

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ć 19

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ć 20

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ć 21

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ć 22

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ć 23

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ć 24

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ć 25

Ü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ć 26

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ć 27

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ć 28

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ć 29

Ü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ć 30

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ć 31

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ć 32

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ć 33

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ć 34

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ć 35

Ausblick (1/2) 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ć 36

Ausblick (2/2) 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ć 37

M. Savorić 38 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ć 39

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ć 40

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ć 41

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ć 42

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ć 43

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ć 44

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ć 45

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ć 46

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ć 47

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ć 48

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ć 49

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ć 50

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ć 51

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ć 52