i

Zeitserver und Echoserver

Auf dieser Seite lernst du, wie man einen Server programmiert. Dabei wirst du einen Zeitserver und einen Echoserver programmieren.

Aufgabe 1

Im Folgenden sind zwei Python-Dialoge dargestellt, die zeitgleich ausgeführt werden. Der linke Dialog stellt einen Client dar. Er kommuniziert mit dem Server, der auf der rechten Seite dargestellt ist. In beiden Dialogen werden die Funktionen sendeStr(komm_s, datenStr), sendeTrennByte(komm_s) und empfangeStr(komm_s) verwendet, die du auf der Seite Client zu einem Geburtstagsserver kennengelernt hast.

Tipp: Wenn du möchtest, kannst du diese Dialoge auch ausführen. Du musst Thonny dazu zwei mal öffnen und in beiden Thonny-Instanzen zunächst die Datei socketLib.py ausführen, damit du die Funktionen sendeStr(komm_s, datenStr), sendeTrennByte(komm_s) und empfangeStr(komm_s) verwenden kannst. Eine Thonny-Instanz dient also Client, die andere als Server.

Auf dem Client gibt es lediglich einen Socket (den Kommunikationssocket komm_s). Über diesen Socket können wir Daten empfangen und senden.

  • Wie viele Sockets gibt es auf dem Server?
  • Wozu werden diese Sockets auf dem Server verwendet?
  • Vergleiche mit dem Client!
Client Server
>>> import socket

>>> # Verbindungssocket erzeugen
>>> verbindungs_s = socket.socket()

>>> # Verbindungssocket an Port 5000 binden
>>> verbindungs_s.bind(('', 5000))

>>> # mit dem Lauschen beginnen
>>> verbindungs_s.listen(20)

>>> # Verbindung annehmen 
>>> # (wartet, bis ein Client eine Verbindung aufbaut)
>>> komm_s, client_adresse = verbindungs_s.accept()
>>> import socket

>>> # Kommunikationssocket erzeugen
>>> komm_s = socket.socket()

>>> # Verbindung aufbauen
>>> adresse = ('127.0.0.1', 5000)
>>> komm_s.connect(adresse)
>>> # Daten des Clients empfangen 
>>> # (wartet, bis der Client Daten 
>>> # und das TrennByte gesendet hat)
>>> anfrageStr = empfangeStr(komm_s)
>>> anfrageStr = 'Wie gehts?'
>>> sendeStr(komm_s, anfrageStr)
>>> sendeTrennByte(komm_s)

>>> # Daten des Servers empfangen 
>>> # (wartet, bis der Server Daten 
>>> # und das TrennByte gesendet hat)
>>> antwortStr = empfangeStr(komm_s)
>>> print(anfrageStr)
'Wie gehts?'

>>> antwortStr = 'Danke, gut!'
>>> sendeStr(komm_s, antwortStr)
>>> sendeTrennByte(komm_s)
>>> print(antwortStr)
'Danke, gut!'
>>> komm_s.close()
>>> komm_s.close()
>>> verbindungs_s.close()

Aufgabe 2

Schreibe einen Server, der die aktuelle Uhrzeit zurückgibt. Der Server soll die Uhrzeit sofort nach dem Verbindungsaufbau senden. Der Client sendet keine Daten.

Du kannst folgenden Client zum Testen verwenden: zeit-client.py

Tipp 1:
Orientiere dich an dem Server-Dialog aus Aufgabe 1. Genauere Erläuterungen zu den Befehlen findest du im Fachkonzept - Client-Server-Kommunikation mit Sockets.

Tipp 2:
Verwende die Funktionen aus der Datei socketLib.py.

Tipp 3:

>>> from datetime import datetime
>>> jetzt = datetime.now()
>>> jetzt.hour
15
>>> jetzt.minute
47
>>> jetzt.second
30
>>> str(jetzt.hour) + ':' + str(jetzt.minute) + ':' + str(jetzt.second)
'15:47:30'

Tipp 4: Orientiere dich an folgender Abbildung:

Ablauf Zeitserver

Mehrere Verbindungen nacheinander bearbeiten

In der letzten Aufgabe wurde der Server nach der Bearbeitung einer Anfrage beendet. In der Regel soll ein Server jedoch nacheinander mehrere Verbindungen bearbeiten. Dazu kann man den Programmteil, der eine Verbindung bearbeitet, in eine Endlosschleife packen. Der Zeitserver aus der voerherigen Aufgabe sieht dann so aus:
import socket
from datetime import datetime
from socketLib import sendeStr, sendeTrennByte

verbindungs_s = socket.socket()
verbindungs_s.bind(('', 5000))
verbindungs_s.listen(20)

while True:
    komm_s, addr = verbindungs_s.accept()

    jetzt = datetime.now()
    jetztStr = str(jetzt.hour) + ':' + str(jetzt.minute) + ':' + str(jetzt.second)

    sendeStr(komm_s, jetztStr)
    sendeTrennByte(komm_s)

    komm_s.close()

Aufgabe 3

Schreibe einen Echo-Server. Dies ist ein Server, der die Daten, die er vom Client erhält, wieder an den Client zurück sendet. Verwende eine Endlosschleife, so dass dein Server mehrere Verbindungen nacheinander bearbeiten kann.

Du kannst folgenden Client zum Testen verwenden: echo-client.py

Tipp: Orientiere dich an folgender Abbildung:

Ablauf Echoserver

Zusatzaufgabe: Verändere die Daten auf dem Server. Du könntest den Echo-Server z.B. zu einem Schrei-Server erweitern. Der Schreiserver schickt die Anfrage des Clients zurück - ersetzt aber alle Kleinbuchstaben durch Großbuchstaben und alle Satzzeichen durch Ausrufezeichen.

Suche

v
10.5.2.4
dev.inf-schule.de/rechnernetze/anwendung/socketprogrammierung/Zeitserver_und_Echoserver
dev.inf-schule.de/10.5.2.4
dev.inf-schule.de/@/page/nh0P4cwERVaIMJGT

Rückmeldung geben