Python-Socket-Dateiübertragung senden

Python Socket File Transfer Send



Die Absicht dieses Artikels ist zu lernen So übertragen Sie eine Textdatei über das Netzwerk über das Python-Programm . Diese Dateiübertragung basiert auf dem Server-Client-Modell, um die Socket-Programmierung in Python3+ zu verwenden.

Hier ist das grundlegende Einrichtungsdiagramm, um dieses Programm auszuführen.









Der Einfachheit halber werden wir im gesamten Artikel System A als A_client und System B als B_server bezeichnen.



Dateianforderungen:

Wir brauchen server.py und diese Datei sollte auf dem Serversystem vorhanden sein. In unserem Fall sollte sich server.py auf dem B_server-System befinden.





Noch zwei Dateien client.py und Beispiel.txt sollte auf dem Client-System vorhanden sein. In unserem Fall sollten diese beiden Dateien im A_Client-System vorhanden sein.

Annahmen:

Hier die Annahmen:



  • Wir sollten zwei Linux-Systeme mit Terminalzugriff haben.
  • Bevorzugte Linux-Variante ist Ubuntu .
  • Python3 sollte installiert sein.
  • Beide Linux-Systeme sollten sich gegenseitig pingen können. Verwenden Klingeln Befehl, um den Ping zu überprüfen.
  • Ein System sollte zu einem bestimmten Zeitpunkt als Server und ein anderes System als Client fungieren.

Einschränkungen:

Bevor wir fortfahren, sollten wir wissen, dass dieses Programm einige Einschränkungen hat.

  • Python3+ sollte installiert sein, um dieses Programm auszuführen. Sie können Fehler oder ein anderes Verhalten beobachten, wenn Sie auf älteren Python-Versionen ausgeführt werden.
  • Mit diesem Programm können ab sofort nur Textdateien übertragen werden. Jede andere Formatdatei, die keinen Text enthält, kann fehlschlagen.
  • Grundlegende Programmierausnahmen wurden im Programm behandelt.
  • Das Programm kann auf einem anderen Betriebssystem als Ubuntu ausgeführt werden oder nicht.
  • Die Textdatei sollte auf der Clientseite kurz sein, da eine Puffergröße von 1024 Byte verwendet wurde.

Voraussetzungen für die Einrichtung:

  • Wir benötigen mindestens ein Linux-System, um dieses Programm auszuprobieren. Es wird jedoch empfohlen, zwei verschiedene Linux-Systeme zu verwenden, die über ein Netzwerk verbunden sind.
  • Zwei Systeme sollten über Ethernet oder Wi-Fi oder andere Verbindungen verbunden sein.

Server-Quellcode:

https://github.com/linuxhintcode/websamples/blob/master/python_send_file/server.py

Client-Quellcode:

https://github.com/linuxhintcode/websamples/blob/master/python_send_file/client.py

So führen Sie Programme und erwartete Ausgabe aus:

Hier sind die Schritte zum Ausführen des Programms.

Schritt 1: Gehen Sie zum B_server-System und öffnen Sie ein Terminal. Abkürzung zum Öffnen eines Terminals ist Alt+Strg+t.

Schritt 2: Gehen Sie nun zu dem Pfad, in dem server.py vorhanden ist.

Schritt 3: Führen Sie nun server.py wie unten beschrieben aus

Python3-Server.py

Es sollten keine Fehler auftreten und Sie sollten die folgenden Drucke sehen

Server listet auf Port: 9898

Der kopierte Dateiname wird serverseitig recv.txt sein

Schritt 4: Öffnen Sie nun das Terminal am A_Client-System.

Schritt 5: Gehen Sie zu dem Pfad, in dem client.py und sample.txt vorhanden sind.

Schritt 6: Führen Sie nun client.py wie unten aus

Python3-Client.py <B_Serversystem-IP>

Wir haben festgestellt, dass wir die IP-Adresse des Servers kennen müssen. Wir können den folgenden Befehl ausführen, um die IP-Adresse des B_server-Systems zu kennen.

ifconfig

Jetzt sollte die Ausgabe des A_client-Systems so aussehen

################## Die folgende Nachricht wird vom Server empfangen ##################
| --------------------------------- |
Hallo Kunde[IP-Adresse: 192.168.1.102],
**Willkommen beim Server**
-Server
| --------------------------------- |

Schritt 7: Gehen Sie nun zu B_server und suchen Sie nach der folgenden Ausgabe

Datei wurde erfolgreich kopiert
Der Server hat die Verbindung getrennt

Schritt 8: Es sollte einen Dateinamen recv.txt im Serverordner geben. Der Inhalt dieser recv.txt sollte dieselbe sample.txt sein.

Wir haben also erfolgreich eine Datei vom Client zum Server über das Netzwerk über das Python-Programm kopiert.

Code-Erklärungen:

Es gibt zwei Python-Dateien server.py und client.py .

Beachten Sie, dass wir einmal erklären werden, ob ein Code in server.py und client.py gleich ist.

  1. server.py:
#!/usr/bin/env python3

Dies ist eine Shebang-Zeile, was bedeutet, dass server.py standardmäßig python3 verwenden sollte. Sehen wir uns einen Vorteil dieser Linie an.

Wir haben server.py oder client.py wie ausgeführt python3. Jetzt können wir ohne Python3 die Python-Datei ausführen. Folgen Sie den folgenden Befehlen

Wechseln Sie in den Superuser-Modus:

es ist

Geben Sie alle Berechtigungen für die .py-Datei:

chmod777Server.py

Führen Sie server.py aus:

./Server.py importieren Steckdose
ImportierenSteckdoseBibliothek in Python-Programmwiewir gehen
benutzenSteckdose zumVerbindung.

S = Steckdose.Steckdose()

Wir erstellen ein Objekt S um auf alle Socket-Methoden zuzugreifen. Dies ist ein OOPs-Konzept.

HAFEN= 9898

Jetzt wählen wir einen Port aus, an dem der Server lauscht. Wir können stattdessen einen nicht reservierten Port verwenden.

S.binden(('',HAFEN))

Wir verwenden die Bindemethode, um die Server-IP-Adresse an diesen Port zu binden [9898]. Eine Beobachtung ist, dass wir anstelle des ersten Arguments der bind-Methode die genaue IP-Adresse des Servers hätten verwenden können, aber wir haben uns entschieden, dieses Feld leer zu lassen, da dies gut funktioniert.

S.binden((IP Adresse,HAFEN))
Datei = offen('recv.txt', 'wb')

Wir haben einen Dateinamen recv.txt im Server für den Schreibmodus geöffnet und einen Dateizeiger erhalten. Dies ist erforderlich, da wir eine Textdatei vom Client kopieren müssen.

während Wahr:

Lassen Sie uns eine unendliche while-Schleife starten, da die Aufgabe des Servers darin besteht, zu warten, bis ein Client mit dem Server an diesem 9898-Port kommuniziert. Diese while-Schleife ist also erforderlich.

conn,Adresse=S.annehmen()

Dieser Code dient dazu, alle eingehenden Verbindungsanfragen vom Client zu akzeptieren. Conn wird verwenden conn um mit dem Kunden zu kommunizieren und Adresse ist die IP-Adresse des Clients, der auf Port 9898 eine Commotion-Anfrage an diesen Server gesendet hat.

Nachricht= ' | --------------------------------- | Hallo Kunde[IP-Adresse:
'
+ Adresse[0]+'], **Willkommen beim Server** -Server
| --------------------------------- | '

Dieser Code dient dazu, eine Nachricht zu erstellen, die an den Client gesendet wird. Diese Nachricht sollte auf dem Client-Terminal gedruckt werden. Dies bestätigt, dass der Client mit dem Server kommunizieren kann.

Anschl.senden(Nachricht.kodieren())

Jetzt haben wir die Nachricht fertig und senden sie dann an den Client Anschl. Dieser Code sendet tatsächlich eine Nachricht an den Client.

RecvData=Anschl.recv(1024)

Dieser Code empfängt alle Daten, die von der Clientseite gesendet werden. In unserem Fall erwarten wir den Inhalt von sample.txt in RecvData .

währendRecvData:

Eine weitere while-Schleife mit der Bedingung RecvData ist nicht leer. In unserem Fall ist es nicht leer.

Datei.schreiben(RecvData)

Sobald wir Inhalt haben RecvData dann schreiben wir in diese Datei recv.txt Dateizeiger verwenden Datei.

RecvData=Anschl.recv(1024)

Versuchen Sie erneut zu empfangen, ob Daten vom Client vorhanden sind. Wenn RecvData keine Daten hat, unterbricht der Code die while-Schleife.

Datei.nah dran()

Dies wird nur den Dateizeiger schließen, wie wir mit dem Dateischreiben fertig sind.

Anschl.nah dran()

Dadurch wird die Verbindung mit dem Client geschlossen.

brechen

Dies soll aus einer unendlichen while-Schleife bei B_server herauskommen.

  1. client.py:
importieren sys

Das Importieren der sys-Bibliothek, wie wir es möchten, verwenden die Argumentfunktion in Python.

wenn (len(sys.argv) > 1):
ServerIp= sys.argv[1]
anders:
drucken(' Lauf wie python3-client.py ')
Ausfahrt(1)

Da wir während der Ausführung die IP-Adresse von B_server nach dem Dateinamen client.py übergeben, müssen wir diese Server-IP-Adresse im Client abfangen.

…..if (len(sys.argv) > 1): => Um sicherzustellen, dass der Benutzer mindestens ein Argument als IP-Adresse übergibt und diese IP-Adresse insdie fängt ServerIP.

Wenn der Benutzer nicht mindestens ein Argument übergibt, zeigt der Code Hilfe an und kommt aus dem Code.

HAFEN= 9898

Dies muss derselbe Port sein, der auf der B_server-Seite erwähnt wurde.

S.verbinden((ServerIp,HAFEN))

Dieser Code stellt eine TCP-Verbindung zur Server-IP mit diesem Port her. Alles, was an dieser Stelle nicht stimmt, führt zu Verbindungsfehlern.

Datei = offen('sample.txt', 'rb')

Wir öffnen sample.txt im Lesemodus, um nur Inhalte zu lesen.

Schicke Daten= Datei.lesen(1024)

Den Inhalt der Datei lesen und hineinlegen Schicke Daten Variable.

währendSchicke Daten:

Wir starten eine while-Schleife, wenn Schicke Daten hat Daten. In unserem Fall, wenn sample.txt nicht leer ist, sollte es Daten enthalten.

S.senden(Schicke Daten)

Jetzt können wir Inhalte von . senden Beispiel.txt zum Server mit Socket-Objekt S.

Schicke Daten= Datei.lesen(1024)

Lesen Sie noch einmal, ob noch etwas übrig ist. Es wird also nichts aus der Datei gelesen Schicke Daten ist leer und kommt aus der while-Schleife.

S.nah dran()

Dies ist nicht das Schließen der Verbindung von der Clientseite.

Ubuntu Screenshots Serverseite

Ubuntu Screenshots Clientseite

Getestete Kombinationen:

  • Linux als Server und Linux als Client: PASS
  • Linux als Client und Linux als Server: PASS
  • Linux als Server und Windows10 als Client: PASS
  • Linux als Client und Windows10 als Server: PASS

Die Empfehlung lautet, zwei Linux-Systeme für Server und Client zu verwenden.

Erwartete Fehler:

  1. Sie können den folgenden Fehler sehen, wenn der Server nicht auf dem 9898-Port läuft

Traceback (letzter Anruf zuletzt):

Datei'client.py',Leitung22, in <Modul>
S.verbinden((ServerIp,HAFEN))
ConnectionRefusedError:[Fehler111]Verbindung abgelehnt
  1. Der folgende Fehler wird angezeigt, wenn die IP-Adresse auf der Clientseite nicht übergeben wird

Lauf wie

Python3-Client.py <Server IP Adresse>
  1. Unten wird ein Fehler angezeigt, wenn 1NSArgument auf der Clientseite ist keine IP-Adresse

Traceback (letzter Anruf zuletzt):

Datei'client.py',Leitung22, in <Modul>
S.verbinden((ServerIp,HAFEN))
Steckdose.gaierror:[Fehler -2]NameoderServicenichtbekannt
  1. Der folgende Fehler wird angezeigt, wenn der Port wie 98980 verwendet wird

Traceback (letzter Anruf zuletzt):

Datei'client.py',Leitung22, in <Modul>
S.verbinden((ServerIp,HAFEN))
Überlauffehler: getsockadrarg: Port muss sein0-65535.
  1. Der folgende Fehler wird angezeigt, wenn sample.txt auf der Clientseite nicht vorhanden ist.

Traceback (letzter Anruf zuletzt):

Datei'client.py',Leitung25, in <Modul>
Datei = offen('sample.txt', 'rb')
FileNotFoundError:[Fehler2]Keine derartigeDatei oderVerzeichnis:'sample.txt'

Abschluss:

Mit diesem Programm können wir eine einfache Textdatei von einem System zu einem anderen System über das Netzwerk mit dem Python-Programm senden. Dies gibt uns grundlegende Kenntnisse der Python- und Socket-Programmierung auch zum Senden von Daten über das Netzwerk.