lager:lok_netze:tcp_python
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
lager:lok_netze:tcp_python [17.09.2019 08:37] – richard | lager:lok_netze:tcp_python [04.02.2025 12:09] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ~~DISCUSSION|Ergänzungen~~ | + | ~~DISCUSSION:closed|Ergänzungen~~ |
====== Programmierung Übung zu TCP mit python ====== | ====== Programmierung Übung zu TCP mit python ====== | ||
Zeile 7: | Zeile 7: | ||
- Programmieren Sie eine einfache Client-Client-Anwendung bei der sich die jeweiligen Clients Nachricht per TCP zusenden. | - Programmieren Sie eine einfache Client-Client-Anwendung bei der sich die jeweiligen Clients Nachricht per TCP zusenden. | ||
- | - Erweitern Sie die Nachrichten um Farben (rot, grün, blau), die zu Beginn des Textes mit einfachen Zeichen vom User ausgewählt werden sollen und auf der Empfangsseite farbig ausgegeben werden. | + | - Erweitern Sie den Server zu einem Multi-Connection-Server, der mehr als eine Verbindung bedienen kann. |
+ | - Geben Sie eingehende Nachrichten an alle anderen Verbindungen aus. | ||
- | < | ||
- | * für blau | ||
- | - für rot | ||
- | + für grün | ||
- | </ | ||
===== Hinweise / Tipps ===== | ===== Hinweise / Tipps ===== | ||
Folgender Code kann als Grundlage für einen sogenannten ECHO-Server dienen, der alle Daten an den Sender zurück schickt, die er empfangen hat. | Folgender Code kann als Grundlage für einen sogenannten ECHO-Server dienen, der alle Daten an den Sender zurück schickt, die er empfangen hat. | ||
+ | |||
+ | Der Code wird [[https:// | ||
+ | |||
+ | ===== ECHO-Server ===== | ||
+ | Der Server binden sich auf den Socket '' | ||
+ | Die empfanenen Daten sendet er an den Client per '' | ||
+ | Zur Kontrolle gibt er per '' | ||
<file python echo_server.py> | <file python echo_server.py> | ||
Zeile 24: | Zeile 27: | ||
import socket | import socket | ||
- | HOST = ' | + | HOST = ' |
- | PORT = 65432 # Port to listen | + | PORT = 65432 # Port auf dem gelauscht (listen) wird (nicht previligierte Ports > 1023) |
with socket.socket(socket.AF_INET, | with socket.socket(socket.AF_INET, | ||
Zeile 38: | Zeile 41: | ||
break | break | ||
conn.sendall(data) | conn.sendall(data) | ||
+ | print(' | ||
</ | </ | ||
+ | |||
+ | ===== ECHO-Client ===== | ||
+ | |||
+ | Der Client schickt genau eine Nachricht an den Server und gibt per '' | ||
+ | |||
+ | <file python echo_client.py> | ||
+ | # | ||
+ | |||
+ | import socket | ||
+ | |||
+ | HOST = ' | ||
+ | PORT = 65432 # Port des Servers eintragen | ||
+ | |||
+ | with socket.socket(socket.AF_INET, | ||
+ | s.connect((HOST, | ||
+ | s.sendall(b' | ||
+ | data = s.recv(1024) | ||
+ | |||
+ | print(' | ||
+ | </ | ||
+ | |||
+ | ==== Interaktiver Echo-Client ==== | ||
+ | |||
+ | <file python echo_client_interactive.py> | ||
+ | # | ||
+ | |||
+ | import socket | ||
+ | |||
+ | HOST = ' | ||
+ | # PORT = 65432 # Port des Servers eintragen | ||
+ | PORT = 50000 | ||
+ | |||
+ | host = input(' | ||
+ | port = input(' | ||
+ | |||
+ | if host != '': | ||
+ | HOST = host | ||
+ | if port != '': | ||
+ | PORT = int(port, 10) | ||
+ | |||
+ | with socket.socket(socket.AF_INET, | ||
+ | s.connect((HOST, | ||
+ | written = '' | ||
+ | while True: | ||
+ | written = input(' | ||
+ | if written == ' | ||
+ | break; | ||
+ | s.sendall(bytearray(written, | ||
+ | data = s.recv(1024) | ||
+ | print(' | ||
+ | |||
+ | print(' | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Multi-Connection-Server ===== | ||
+ | |||
+ | Quelle: Das Beispiel stammt ursprünglich von dieser [[https:// | ||
+ | Als Client kann der '' | ||
+ | |||
+ | Diese Verbindungen können mittels: | ||
+ | < | ||
+ | angezeigt werden. Hier ist '' | ||
+ | |||
+ | |||
+ | <file python tcp_multi_server.py> | ||
+ | # | ||
+ | |||
+ | import select, socket, sys, queue | ||
+ | server = socket.socket(socket.AF_INET, | ||
+ | server.setblocking(0) | ||
+ | server.bind((' | ||
+ | server.listen(5) | ||
+ | inputs = [server] | ||
+ | outputs = [] | ||
+ | message_queues = {} | ||
+ | |||
+ | while inputs: | ||
+ | readable, writable, exceptional = select.select( | ||
+ | inputs, outputs, inputs) | ||
+ | for s in readable: | ||
+ | if s is server: | ||
+ | connection, client_address = s.accept() | ||
+ | connection.setblocking(0) | ||
+ | inputs.append(connection) | ||
+ | message_queues[connection] = queue.Queue() | ||
+ | else: | ||
+ | data = s.recv(1024) | ||
+ | if data: | ||
+ | message_queues[s].put(data) | ||
+ | if s not in outputs: | ||
+ | outputs.append(s) | ||
+ | else: | ||
+ | if s in outputs: | ||
+ | outputs.remove(s) | ||
+ | inputs.remove(s) | ||
+ | s.close() | ||
+ | del message_queues[s] | ||
+ | |||
+ | for s in writable: | ||
+ | try: | ||
+ | next_msg = message_queues[s].get_nowait() | ||
+ | except queue.Empty: | ||
+ | outputs.remove(s) | ||
+ | else: | ||
+ | s.send(next_msg) | ||
+ | |||
+ | for s in exceptional: | ||
+ | inputs.remove(s) | ||
+ | if s in outputs: | ||
+ | outputs.remove(s) | ||
+ | s.close() | ||
+ | del message_queues[s] | ||
+ | </ | ||
+ | |||
+ | ===== Keystroke als Command Line Handler ===== | ||
+ | |||
+ | ACHTUNG: Das folgende Beispiel funktioniert nur, wenn das Script direkt in der Shell ausgeführt wird. Hierzu muss zunächst die Datei ausführbar gemacht werden. Mit folgendem Befehl kann dies getan werden: | ||
+ | |||
+ | < | ||
+ | |||
+ | Das folgende Bespiel wartet dauerhaft auf eine Eingabe und führt je nach Tastedruck Programmcode aus. | ||
+ | <file python keystroke_sample.py> | ||
+ | # | ||
+ | |||
+ | import sys, termios, tty, os, time | ||
+ | |||
+ | def getch(): | ||
+ | fd = sys.stdin.fileno() | ||
+ | old_settings = termios.tcgetattr(fd) | ||
+ | try: | ||
+ | tty.setraw(sys.stdin.fileno()) | ||
+ | ch = sys.stdin.read(1) | ||
+ | |||
+ | finally: | ||
+ | termios.tcsetattr(fd, | ||
+ | return ch | ||
+ | |||
+ | while True: | ||
+ | char = getch() | ||
+ | |||
+ | if (char == " | ||
+ | print(" | ||
+ | exit(0) | ||
+ | |||
+ | if (char == " | ||
+ | print(" | ||
+ | time.sleep(1) | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
lager/lok_netze/tcp_python.1568709472.txt.gz · Zuletzt geändert: 04.02.2025 12:10 (Externe Bearbeitung)