Grundlagen von Python Sockets und grundlegende Kommunikation
Beginnen wir damit, zu verstehen, was Sockets sind und wie sie in Python funktionieren.
Was ist ein Socket?
Ein Socket ist ein Endpunkt zum Senden und Empfangen von Daten über ein Netzwerk. Stellen Sie sich ihn als einen virtuellen Verbindungspunkt vor, durch den die Netzwerkkommunikation fließt. Das in Python integrierte socket-Modul stellt die Werkzeuge zum Erstellen, Konfigurieren und Verwenden von Sockets für die Netzwerkkommunikation bereit.
Grundlegender Socket-Kommunikationsablauf
Die Socket-Kommunikation folgt typischerweise diesen Schritten:
- Erstellen eines Socket-Objekts
- Binden des Sockets an eine Adresse (für Server)
- Auf eingehende Verbindungen warten (für Server)
- Verbindungen akzeptieren (für Server) oder sich mit einem Server verbinden (für Clients)
- Daten senden und empfangen
- Den Socket schließen, wenn er fertig ist
Lassen Sie uns unser erstes einfaches Socket-Programm erstellen, um diese Konzepte besser zu verstehen.
Erstellen Ihres ersten Socket-Servers
Zuerst erstellen wir einen einfachen Socket-Server, der auf Verbindungen wartet und alle empfangenen Daten zurückgibt.
Öffnen Sie die WebIDE und erstellen Sie eine neue Datei namens server.py im Verzeichnis /home/labex/project mit folgendem Inhalt:
import socket
## Define server address and port
HOST = '127.0.0.1' ## Standard loopback interface address (localhost)
PORT = 65432 ## Port to listen on (non-privileged ports are > 1023)
## Create a socket object
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(f"Socket created successfully")
## Bind the socket to the specified address and port
server_socket.bind((HOST, PORT))
print(f"Socket bound to {HOST}:{PORT}")
## Listen for incoming connections
server_socket.listen(1)
print(f"Socket is listening for connections")
## Accept a connection
print(f"Waiting for a connection...")
connection, client_address = server_socket.accept()
print(f"Connected to client: {client_address}")
## Receive and echo data
try:
while True:
## Receive data from the client
data = connection.recv(1024)
if not data:
## If no data is received, the client has disconnected
print(f"Client disconnected")
break
print(f"Received: {data.decode('utf-8')}")
## Echo the data back to the client
connection.sendall(data)
print(f"Sent: {data.decode('utf-8')}")
finally:
## Clean up the connection
connection.close()
server_socket.close()
print(f"Socket closed")
Erstellen Ihres ersten Socket-Clients
Erstellen wir nun einen Client, um sich mit unserem Server zu verbinden. Erstellen Sie eine neue Datei namens client.py im selben Verzeichnis mit folgendem Inhalt:
import socket
## Define server address and port
HOST = '127.0.0.1' ## The server's hostname or IP address
PORT = 65432 ## The port used by the server
## Create a socket object
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(f"Socket created successfully")
## Connect to the server
client_socket.connect((HOST, PORT))
print(f"Connected to server at {HOST}:{PORT}")
## Send and receive data
try:
## Send data to the server
message = "Hello, Server!"
client_socket.sendall(message.encode('utf-8'))
print(f"Sent: {message}")
## Receive data from the server
data = client_socket.recv(1024)
print(f"Received: {data.decode('utf-8')}")
finally:
## Clean up the connection
client_socket.close()
print(f"Socket closed")
Testen Ihrer Socket-Programme
Testen wir nun unsere Socket-Programme. Öffnen Sie zwei Terminalfenster in der LabEx VM.
Führen Sie im ersten Terminal den Server aus:
cd ~/project
python3 server.py
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
Socket created successfully
Socket bound to 127.0.0.1:65432
Socket is listening for connections
Waiting for a connection...
Lassen Sie den Server laufen und öffnen Sie ein zweites Terminal, um den Client auszuführen:
cd ~/project
python3 client.py
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
Socket created successfully
Connected to server at 127.0.0.1:65432
Sent: Hello, Server!
Received: Hello, Server!
Socket closed
Und im Server-Terminal sollten Sie Folgendes sehen:
Connected to client: ('127.0.0.1', XXXXX)
Received: Hello, Server!
Sent: Hello, Server!
Client disconnected
Socket closed
Herzlichen Glückwunsch! Sie haben gerade Ihre erste socket-basierte Client-Server-Anwendung in Python erstellt und getestet. Dies bildet die Grundlage für das Verständnis, wie die Socket-Kommunikation funktioniert und wie die Fehlerbehandlung in den nächsten Schritten implementiert wird.