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:38] – 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 ===== | ||
| Zeile 20: | Zeile 16: | ||
| Der Code wird [[https:// | 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 26: | 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 40: | 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.1568709513.txt.gz · Zuletzt geändert: (Externe Bearbeitung)
