Was ist Socket-Programmierung in Python und wie beherrscht man es?



Erfahren Sie, was Socket-Programmierung in Python ist, wie Client-Server-Kommunikation und wie Sie Python-Objekte mithilfe von Pickle und Sockets übertragen.

Das Internet ist zweifellos zur „Seele der Existenz“ geworden und seine Aktivität ist durch „Verbindungen“ oder „Netzwerke“ gekennzeichnet. Diese Netzwerke werden durch eine der wichtigsten Grundlagen von ermöglicht Steckdosen. Dieser Artikel behandelt alle Bereiche, die sich mit der Socket-Programmierung in Python befassen. Sockets helfen Ihnen dabei, diese Verbindungen herzustellen zweifellos macht es einfach.

Werfen wir einen kurzen Blick auf alle in diesem Artikel behandelten Themen:





Warum Sockets verwenden?
Was sind Sockets in Python?
So erreichen Sie die Socket-Programmierung in Python
Was ist ein Server?
Was ist ein Kunde?
Echo Client-Server
Mehrfachkommunikation
Python-Objekte übertragen

Was ist __init__ in Python?



Warum Sockets verwenden?

Sockets sind das Rückgrat der Vernetzung. Sie ermöglichen die Übertragung von Informationen zwischen zwei verschiedenen Programmen oder Geräten. Wenn Sie beispielsweise Ihren Browser öffnen, stellen Sie als Client eine Verbindung zum Server für die Übertragung von Informationen her.

Bevor wir uns eingehender mit dieser Kommunikation befassen, wollen wir zunächst herausfinden, was genau diese Steckdosen sind.

Was sind Steckdosen?

Im Allgemeinen sind Sockets interne Endpunkte zum Senden und Empfangen von Daten. Ein einzelnes Netzwerk verfügt über zwei Sockets, einen für jedes kommunizierende Gerät oder Programm. Diese Sockets sind eine Kombination aus einer IP-Adresse und einem Port. Ein einzelnes Gerät kann basierend auf der verwendeten Portnummer eine Anzahl von n Sockets haben. Für verschiedene Protokolltypen stehen verschiedene Ports zur Verfügung. Schauen Sie sich das folgende Bild an, um mehr über einige der gängigen Portnummern und die zugehörigen Protokolle zu erfahren:




gemeinsame Ports-SocketProgramminginPython-Edureka

Nachdem Sie sich mit dem Konzept der Sockets vertraut gemacht haben, werfen wir einen Blick auf das Socket-Modul von Python:

So erreichen Sie die Socket-Programmierung in Python:

Um die Socket-Programmierung in Python zu erreichen, müssen Sie die importieren Steckdose Modul oder . Dieses Modul besteht aus integrierten Methoden, die zum Erstellen von Sockets erforderlich sind und deren Zuordnung unterstützen.

Einige der wichtigsten Methoden sind wie folgt:

MethodenBeschreibung

socket.socket ()

wird zum Erstellen von Sockets verwendet (erforderlich sowohl auf Server- als auch auf Client-Enden, um Sockets zu erstellen)

socket.accept ()

wird verwendet, um eine Verbindung zu akzeptieren. Es gibt ein Wertepaar (conn, address) zurück, wobei conn ein neues Socket-Objekt zum Senden oder Empfangen von Daten ist und address die Adresse des Sockets am anderen Ende der Verbindung ist

socket.bind ()

Wird verwendet, um an die als Parameter angegebene Adresse zu binden

socket.close ()

wird verwendet, um die Steckdose als geschlossen zu markieren

socket.connect ()

Wird verwendet, um eine Verbindung zu einer als Parameter angegebenen Remote-Adresse herzustellen

socket.listen ()

ermöglicht dem Server, Verbindungen zu akzeptieren

Nachdem Sie die Bedeutung des Socket-Moduls verstanden haben, wollen wir nun sehen, wie es dazu dienen kann, Server und Clients für die Socket-Programmierung in zu erstellen .

Was ist ein Server?

Ein Server ist entweder ein Programm, ein Computer oder ein Gerät, das für die Verwaltung von Netzwerkressourcen vorgesehen ist. Server können sich entweder auf demselben Gerät oder Computer befinden oder lokal mit anderen Geräten und Computern verbunden sein oder sogar remote. Es gibt verschiedene Arten von Servern wie Datenbankserver, Netzwerkserver, Druckserver usw.

Server verwenden üblicherweise Methoden wie socket.socket (), socket.bind (), socket.listen () usw., um eine Verbindung herzustellen und eine Verbindung zu den Clients herzustellen. Schreiben wir nun ein Programm zum Erstellen eines Servers. Betrachten Sie das folgende Beispiel:

BEISPIEL:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) #port number kann zwischen 0 und 65535 liegen (normalerweise geben wir nicht vorrangige Ports an) > 1023) s.listen (5) während True: clt, adr = s.accept () print (f'Verbindung zu {adr} hergestellt ') #f Zeichenfolge ist eine Literalzeichenfolge mit dem Präfix f, die # Python-Ausdrücke in geschweiften Klammern clt enthält .send (Bytes ('Socket-Programmierung in Python', 'utf-8')) #, um Informationen an clientsocket zu senden

Wie Sie sehen, besteht die erste Notwendigkeit zum Erstellen eines Sockets darin, das Socket-Modul zu importieren. Danach wird mit der Methode socket.socket () ein serverseitiger Socket erstellt.

HINWEIS:

AF_INET bezieht sich auf eine Adresse aus dem Internet und erfordert ein Paar (Host, Port), wobei der Host entweder eine URL einer bestimmten Website oder deren Adresse sein kann und die Portnummer eine Ganzzahl ist. Mit SOCK_STREAM werden TCP-Protokolle erstellt.

Die bind () -Methode akzeptiert zwei Parameter als Tupel (Host, Port). Es ist jedoch besser, 4-stellige Portnummern zu verwenden, da die unteren normalerweise belegt sind. Mit der listen () -Methode kann der Server Verbindungen akzeptieren. Hier ist 5 die Warteschlange für mehrere Verbindungen, die gleichzeitig hergestellt werden. Der Mindestwert, der hier angegeben werden kann, ist 0 (Wenn Sie einen geringeren Wert angeben, wird dieser in 0 geändert). Falls kein Parameter angegeben ist, wird ein geeigneter Standardparameter verwendet.

Das ermöglicht das Akzeptieren von Verbindungen für immer. 'Clt' und 'adr' sind das Clientobjekt und die Adresse. Die print-Anweisung druckt nur die Adresse und die Portnummer des Client-Sockets aus. Schließlich wird clt.send verwendet, um die Daten in Bytes zu senden.

Nachdem unser Server eingerichtet ist, gehen wir zum Client.

Was ist ein Kunde?

Ein Client ist entweder ein Computer oder eine Software, die Informationen oder Dienste vom Server empfängt. In einem Client-Server-Modul fordern Clients Dienste von Servern an. Das beste Beispiel ist ein Webbrowser wie Google Chrome, Firefox usw. Diese Webbrowser fordern Webserver für die erforderlichen Webseiten und Dienste an, wie vom Benutzer angegeben. Andere Beispiele sind Online-Spiele, Online-Chats usw.

Schauen wir uns nun an, wie das clientseitige Programm codiert wird ::

BEISPIEL:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) msg ​​= s.recv (1024) print (msg.decode ('utf-8') )

Der erste Schritt besteht darin, das Socket-Modul zu importieren und dann einen Socket zu erstellen, wie Sie es beim Erstellen eines Servers getan haben. Um eine Verbindung zwischen dem Client-Server herzustellen, müssen Sie die connect () -Methode verwenden, indem Sie (Host, Port) angeben.


HINWEIS: gethostname wird verwendet, wenn sich Client und Server auf demselben Computer befinden. (LAN - localip / WAN - publicip)

Hier möchte der Client einige Informationen vom Server erhalten. Dazu müssen Sie die Methode recv () verwenden und die Informationen werden in einer anderen Variablen msg gespeichert. Denken Sie daran, dass die übergebenen Informationen in Bytes vorliegen und der Client im obigen Programm in einer einzigen Übertragung bis zu 1024 Bytes (Puffergröße) empfangen kann. Abhängig von der Menge der übertragenen Informationen kann ein beliebiger Betrag angegeben werden.

Schließlich sollte die übertragene Nachricht dekodiert und gedruckt werden.

Nachdem Sie nun wissen, wie Client-Server-Programme erstellt werden, sehen wir uns an, wie sie ausgeführt werden müssen.

Echo Client-Server:

Um diese Programme auszuführen, öffnen Sie Ihre Eingabeaufforderung, wechseln Sie in den Ordner, in dem Sie Ihr Client- und Serverprogramm erstellt haben, und geben Sie Folgendes ein:

py server.py (hier ist server.py der Dateiname des Servers, Sie können auch py -3.7 server.py verwenden)

Sobald dies erledigt ist, wird der Server gestartet. Öffnen Sie zum Ausführen des Clients ein weiteres cmd-Fenster und geben Sie Folgendes ein:

py client.py (hier ist client.py der Dateiname des Clients)

AUSGANG (SERVER):

(KLIENT)

Versuchen wir dasselbe Programm, indem wir die Puffergröße auf 7 reduzieren und sehen, welche Ausgabe wir erhalten:

AUSGABE:

Wie Sie sehen, wird die Verbindung nach der Übertragung von 7 Bytes beendet. Dies ist jedoch ein Problem, da Sie nicht die vollständigen Informationen erhalten haben und die Verbindung geschlossen ist. Lassen Sie uns dieses Problem lösen.

Mehrfachkommunikation:

Damit die Verbindung fortgesetzt werden kann, bis der Client die vollständigen Informationen erhält, können Sie die while-Schleife verwenden:

BEISPIEL:

importiere socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) während True: msg = s.recv (7) print (msg.decode ('utf- 8 '))

Sobald Sie dies tun, wird die vollständige Nachricht in 7 Bytes pro Übertragung empfangen.

Wie Sie sehen, wird die Verbindung diesmal jedoch nicht beendet und Sie wissen nie, wann dies geschehen wird. Und was ist, wenn Sie nicht wissen, wie groß die Nachricht oder Informationen sind, die der Client vom Server erhält? In solchen Fällen können Sie auf der Clientseite tatsächlich das folgende Codebit verwenden:

BEISPIEL:

complete_info = '' während True: msg = s.recv (7) wenn len (msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

Verwenden Sie auf der Serverseite die Methode close () wie folgt:

clt.close ()

Die Ausgabe erfolgt wie im Bild unten gezeigt:

AUSGABE:



Der obige Codeblock besteht lediglich darin, die Größe der Informationen zu überprüfen und sie in einem Puffer von jeweils zwei Bytes zu drucken sowie die Verbindung nach Abschluss zu schließen.

Übertragen von Python-Objekten:

Bis hierher haben Sie gerade das Talent, Saiten zu übertragen. Aber Socket-Programmierung in Python Außerdem können Sie Python-Objekte übertragen. Diese Objekte können Sätze, Tupel, Wörterbücher usw. sein. Um dies zu erreichen, müssen Sie das Pickle-Modul von Python importieren.

Python-Pickle-Modul:

Das Python-Pickle-Modul wird angezeigt, wenn Sie Objekte in Python tatsächlich serialisieren oder de-serialisieren. Schauen wir uns ein kleines Beispiel an:

BEISPIEL:

import pickle mylist = [1,2, 'abc'] mymsg = pickle.dumps (mylist) print (mymsg)

AUSGABE: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ’

Wie Sie sehen können, wird im obigen Programm 'mylist' mit der Funktion dumps () des Pickle-Moduls serialisiert. Beachten Sie auch, dass die Ausgabe mit einem 'b' beginnt, was bedeutet, dass sie in Bytes konvertiert wird. In der Socket-Programmierung können Sie dieses Modul zum Übertragen implementieren Python-Objekte zwischen Clients und Servern.

Wie verwende ich das Pickle-Modul zum Übertragen von Python-Objektstrukturen?

Wenn Sie Pickle zusammen mit Sockets verwenden, können Sie absolut alles über das Netzwerk übertragen. Notieren wir uns die serverseitigen und clientseitigen Gegenstücke, um eine Liste vom Server auf den Client zu übertragen:

Java-Konvertierungszeichenfolge in Datum

Serverseitig:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 2133)) #binding tuple s.listen (5) while True: clt, adr = s.accept () print (f'Verbindung zu {adr} hergestellt ') m = {1:' Client ', 2:' Server '} mymsg = pickle.dumps (m) #die Nachricht, die wir später drucken möchten mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

Hier ist m ein Wörterbuch, das im Grunde a ist Das muss vom Server an den Client gesendet werden. Dazu wird das Objekt zunächst mit dumps () serialisiert und anschließend in Bytes konvertiert.
Schreiben wir nun das clientseitige Gegenstück auf:

Client-Seite:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2133)) während True: complete_info = b '' rec_msg = True während True: mymsg = s.recv (10) wenn rec_msg: print (f'Die Länge der Nachricht = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = False complete_info + = mymsg if len (complete_info) -a == x: print ('Die vollständigen Informationen erhalten') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b '' print (complete_info )

Die erste while-Schleife hilft uns dabei, die vollständige Nachricht (complete_info) sowie die Nachricht, die über den Puffer empfangen wird (rec_msg), zu verfolgen. die Nachricht durch Setzen von rec_
Während die Nachricht empfangen wird, drucke ich nur jedes Bit davon aus und werde in einem Puffer der Größe 10 empfangen. Diese Größe kann je nach Ihrer persönlichen Wahl beliebig groß sein.

Wenn die empfangene Nachricht der vollständigen Nachricht entspricht, drucke ich die Nachricht nur als empfangene vollständige Information aus, woraufhin ich die Nachricht mithilfe von load () de-serialisiert habe.

Die Ausgabe an das obige Programm ist wie folgt:

Dies bringt uns zum Ende dieses Artikels über Socket-Programmierung in Python. Ich hoffe, Sie haben alle Konzepte klar verstanden.

Stellen Sie sicher, dass Sie so viel wie möglich üben und Ihre Erfahrung zurücksetzen.

Hast du eine Frage an uns? Bitte erwähnen Sie es im Kommentarbereich dieses Blogs „Socket Programming in Python“. Wir werden uns so schnell wie möglich bei Ihnen melden.

Um detaillierte Informationen zu Python und seinen verschiedenen Anwendungen zu erhalten, können Sie sich live anmelden mit 24/7 Support und lebenslangem Zugriff.