Python Socket-Programmierung - Server-, Client-Beispiel
Guten Tag, Lernende! In unserem vorherigen Tutorial haben wir das Python unittest-Modul besprochen. Heute werden wir ein Beispiel für Python-Socket-Programmierung betrachten. Wir werden Python-Socket-Server- und Client-Anwendungen erstellen.
Python Socket-Programmierung
Um die Python-Socket-Programmierung zu verstehen, müssen wir über drei interessante Themen Bescheid wissen - Socket-Server, Socket-Client und Socket. Also, was ist ein Server? Nun, ein Server ist eine Software, die auf Client-Anfragen wartet und diese entsprechend bedient oder verarbeitet. Auf der anderen Seite ist ein Client der Anforderer dieses Dienstes. Ein Client-Programm fordert einige Ressourcen vom Server an und der Server reagiert auf diese Anfrage. Ein Socket ist der Endpunkt eines bidirektionalen Kommunikationskanals zwischen Server und Client. Sockets können innerhalb eines Prozesses, zwischen Prozessen auf demselben Rechner oder zwischen Prozessen auf verschiedenen Rechnern kommunizieren. Für jede Kommunikation mit einem entfernten Programm müssen wir über einen Socket-Port eine Verbindung herstellen. Das Hauptziel dieses Tutorials zur Socket-Programmierung ist es, Ihnen zu zeigen, wie Socket-Server und Client miteinander kommunizieren. Sie werden auch lernen, wie man ein Python-Socket-Server-Programm schreibt.
Python Socket Beispiel
Wie bereits erwähnt, fordert ein Socket-Client Ressourcen vom Socket-Server an, und der Server antwortet auf diese Anfrage. Daher werden wir sowohl das Server- als auch das Client-Modell entwerfen, damit beide miteinander kommunizieren können. Die Schritte können wie folgt betrachtet werden.
- Das Python-Socket-Serverprogramm wird zuerst ausgeführt und wartet auf eine Anfrage.
- Das Python-Socket-Client-Programm wird das Gespräch zuerst initiieren.
- Dann wird das Serverprogramm entsprechend auf die Client-Anfragen reagieren.
- Das Client-Programm wird beendet, wenn der Benutzer die Nachricht "bye" eingibt. Das Server-Programm wird ebenfalls beendet, wenn das Client-Programm beendet wird; dies ist optional, und wir können das Server-Programm unbegrenzt weiterlaufen lassen oder es mit einem bestimmten Befehl in der Client-Anfrage beenden.
Python Socket-Server
Wir werden das Python-Socket-Server-Programm als socket_server.py speichern. Um eine Python-Socket-Verbindung zu nutzen, müssen wir das socket-Modul importieren. Dann müssen wir der Reihe nach einige Aufgaben durchführen, um eine Verbindung zwischen Server und Client herzustellen. Wir können die Host-Adresse mit der Funktion socket.gethostname() erhalten. Es wird empfohlen, eine Portadresse über 1024 zu verwenden, da Portnummern unter 1024 für standardisierte Internetprotokolle reserviert sind. Siehe den untenstehenden Beispielcode für einen Python-Socket-Server; die Kommentare helfen Ihnen, den Code zu verstehen.
import socket
def server_program():
# get the hostname
host = socket.gethostname()
port = 5000 # initiate port no above 1024
server_socket = socket.socket() # get instance
# look closely. The bind() function takes tuple as argument
server_socket.bind((host, port)) # bind host address and port together
# configure how many client the server can listen simultaneously
server_socket.listen(2)
conn, address = server_socket.accept() # accept new connection
print("Connection from: " + str(address))
while True:
# receive data stream. it won't accept data packet greater than 1024 bytes
data = conn.recv(1024).decode()
if not data:
# if data is not received break
break
print("from connected user: " + str(data))
data = input(' -> ')
conn.send(data.encode()) # send data to the client
conn.close() # close the connection
if __name__ == '__main__':
server_program()
Unser Python-Socket-Server läuft also auf Port 5000 und wartet auf Client-Anfragen. Wenn du möchtest, dass der Server nicht beendet wird, wenn die Client-Verbindung geschlossen wird, entferne einfach die if-Bedingung und die break-Anweisung. Die Python-while-Schleife wird verwendet, um das Serverprogramm unbegrenzt auszuführen und weiterhin auf Client-Anfragen zu warten.
Python Socket-Client
Wir werden das Python-Socket-Client-Programm als socket_client.py speichern. Dieses Programm ist dem Serverprogramm ähnlich, mit der Ausnahme der Bindung. Der wichtigste Unterschied zwischen Server- und Client-Programm besteht darin, dass das Serverprogramm die Hostadresse und die Portadresse zusammen binden muss. Siehe den untenstehenden Python-Socket-Client-Beispielcode, der Kommentar wird Ihnen helfen, den Code zu verstehen.
import socket
def client_program():
host = socket.gethostname() # as both code is running on same pc
port = 5000 # socket server port number
client_socket = socket.socket() # instantiate
client_socket.connect((host, port)) # connect to the server
message = input(" -> ") # take input
while message.lower().strip() != 'bye':
client_socket.send(message.encode()) # send message
data = client_socket.recv(1024).decode() # receive response
print('Received from server: ' + data) # show in terminal
message = input(" -> ") # again take input
client_socket.close() # close the connection
if __name__ == '__main__':
client_program()
Python Socket-Programmierausgabe
Um die Ausgabe zu sehen, führen Sie zuerst das Socket-Server-Programm aus. Dann führen Sie das Socket-Client-Programm aus. Danach schreiben Sie etwas im Client-Programm. Danach antworten Sie erneut vom Server-Programm. Schließlich schreiben Sie tschüss im Client-Programm, um beide Programme zu beenden. Das folgende kurze Video zeigt, wie es in meinem Testlauf der Beispiele für Socket-Server und -Client funktioniert hat.
pankaj$ python3.6 socket_server.py
Connection from: ('127.0.0.1', 57822)
from connected user: Hi
-> Hello
from connected user: How are you?
-> Good
from connected user: Awesome!
-> Ok then, bye!
pankaj$
pankaj$ python3.6 socket_client.py
-> Hi
Received from server: Hello
-> How are you?
Received from server: Good
-> Awesome!
Received from server: Ok then, bye!
-> Bye
pankaj$
Beachten Sie, dass der Socket-Server auf Port 5000 läuft, aber der Client ebenfalls einen Socket-Port benötigt, um sich mit dem Server zu verbinden. Dieser Port wird zufällig durch den Client-Connect-Aufruf zugewiesen. In diesem Fall ist es 57822. Das ist alles für die Python-Socket-Programmierung, die Beispiele für den Python-Socket-Server und den Socket-Client. Referenz: Offizielle Dokumentation.

