Python Socket -Dateiübertragung senden

Python Socket -Dateiübertragung senden
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+.

Basic Setup Diagramm:

Hier ist das grundlegende Setup -Diagramm, um dieses Programm auszuführen.

Der Einfachheit halber nennen wir System A als A_Client und System B als B_server während des Artikels.

Dateianforderungen:

Wir brauchen Server.py und diese Datei sollte auf dem Serversystem vorhanden sein. In unserem Fallserver.PY sollte am B_SERVER -System sein.

Zwei weitere Dateien Klient.py Und Probe.txt sollte im Client -System vorhanden sein. In unserem Fall sollten diese beiden Dateien am a_client System vorhanden sein.

Annahmen:

Hier sind die Annahmen:

  • Wir sollten zwei Linux -Systeme mit Terminalzugriff haben.
  • Vorzuger Linux -Geschmack ist Ubuntu.
  • Python3 sollte installiert werden.
  • Beide Linux -Systeme sollten in der Lage sein, sich gegenseitig zu pingen. Verwenden Klingeln Befehl zum Überprüfen von Ping.
  • Ein System sollte als Server fungieren und ein anderes System sollte zu einem bestimmten Zeitpunkt als Client fungieren.

Einschränkungen:

Bevor wir weiter fortfahren, sollten wir wissen, dass es einige Einschränkungen dieses Programms gibt.

  • Python3+ sollte installiert werden, um dieses Programm auszuführen. Sie können Fehler oder unterschiedliches Verhalten beobachten, wenn Sie auf älteren Python -Versionen ausgeführt werden.
  • Ab sofort kann nur eine Textdatei über dieses Programm übertragen werden. Jede andere Formatdatei, die keinen Text enthalten.
  • 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 die Puffergröße von 1024 Bytes verwendet wurde.

Anforderungen einrichten:

  • Wir brauchen mindestens ein Linux -System, um dieses Programm auszuprobieren. Die Empfehlung besteht jedoch darin, zwei verschiedene Linux -Systeme zu verwenden, die über das Netzwerk verbunden sind.
  • Zwei Systeme sollten über Ethernet oder Wi-Fi oder andere Verbindungen angeschlossen werden.

Serverquellcode:

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

#!/usr/bin/env python3
# Bibliotheken importieren
Socket importieren
Importsystem
# Lassen Sie uns das erste Argument als Server -IP fangen
if (len (sys.argv)> 1):
Serverip = sys.Argv [1]
anders:
print ("\ n \ n wie \ n python3 client ausführen.py \ n \ n ")
Ausgang (1)
# Jetzt können wir Socket -Objekt erstellen
S = Socket.Steckdose()
# Wählen wir einen Port auswählen und stellen uns eine Verbindung zu diesem Port her
Port = 9898
# Nehmen wir eine Verbindung zu diesem Port her, auf dem der Server möglicherweise ausgeführt wird
S.Connect ((Serverip, Port))
# Wir können eine Dateispiele senden.txt
Datei = open ("Beispiel.txt "," rb ")
SendData = Datei.Read (1024)
während sendData:
# Jetzt können wir Daten vom Server empfangen
print ("\ n \ n ##########################################\ \ n \ n ", s.recv (1024).decode ("utf-8"))
#Now Senden Sie den Inhalt der Stichprobe.txt zum Server
S.send (sendData)
SendData = Datei.Read (1024)
# Schließen Sie die Verbindung von der Clientseite von der Client -Seite
S.schließen()

So führen Sie Programme und erwartete Ausgabe aus:

Hier sind die Schritte zur Ausführung des Programms.

STEP1: Gehen Sie zum B_SERVER -System und öffnen Sie ein Terminal. Abkürzung, um ein Terminal zu öffnen, ist Alt+Strg+t.

SCHRITT2: Gehen Sie nun den Pfad auf dem Server.PY ist vorhanden.

Schritt 3: Jetzt Server ausführen.py wie unten

Python3 Server.py

Es sollte keine Fehler geben, und Sie sollten folgende Drucke sehen

Der Server wird auf Port aufgelistet: 9898

Der kopierte Dateiname wird recv sein.TXT auf der Serverseite

STEP4: Jetzt öffnen Sie das Terminal am A_Client -System.

Schritt 5: Gehen Sie zum Pfad wo der Client.PY und Probe.TXT sind vorhanden.

STEP6: Jetzt Kunden ausführen.py wie unten

Python3 -Kunde.py

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 sein

################## Below message is received from server ##################
| ---------------------------------- |
Hallo Client [IP -Adresse: 192.168.1.102],
** Willkommen zum Server **
-Server
| ---------------------------------- |

STEP7: Gehen Sie nun zu B_SERVER und suchen Sie nach der folgenden Ausgabe

Die Datei wurde erfolgreich kopiert
Der Server hat die Verbindung getrennt

Schritt 8: Es sollte einen Dateinamen Recv geben.TXT im Serverordner. Der Inhalt dieses Recv.TXT sollte die gleiche Probe sein.txt.

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

Code Erklärungen:

Es gibt zwei Python -Dateien Server.py Und Klient.py.

Beachten Sie, dass wir einmal erklären, ob ein Code im Server gleich ist.Py und Kunde.py.

  1. Server.PY:
#!/usr/bin/env python3

Dies ist Shebang -Zeile, was standardmäßig diesen Server bedeutet.PY sollte Python3 verwenden. Lassen Sie uns einen Vorteil dieser Linie sehen.

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

Gehen Sie zum Super -Benutzer -Modus:

su

Geben Sie alle Erlaubnis an .PY -Datei:

CHMOD 777 Server.py

Server ausführen.PY:

./Server.py
Socket importieren
#Importing Socket Library in das Python -Programm, da wir Socket für die Verbindung verwenden möchten.
S = Socket.Steckdose()

Wir erstellen ein Objekt "S" Zugriff auf alle Methoden der Sockel. Dies ist ein OOPS -Konzept.

Port = 9898

Jetzt wählen wir einen Port, an dem der Server zuhört. Wir können anstelle dessen nicht reservierte Port verwenden.

S.binden (", Port))

Wir verwenden die Bind -Methode, um die Server -IP -Adresse an diesen Port zu binden [9898]. Eine Beobachtung ist.

S.binden ((IP -Adresse, Port))
Datei = open ("recv.txt "," wb ")

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

während wahr:

Beginnen wir einen unendlichen, während die Aufgabe des Servers ist, zu warten, bis ein Client mit dem Server über diesen 9898 -Port kommuniziert. Dies ist also während der Schleife erforderlich.

conn, addr = s.akzeptieren()

Dieser Code wird eine eingehende Verbindungsanforderung vom Client annehmen. Conn wird verwendet “Conn “ mit dem Kunden zu kommunizieren und "ADDR" ist die IP -Adresse des Clients, der eine Aufnahmeanforderung an diesen Server auf Port 9898 gesendet hat.

msg = "\ n \ n | ---------------------------------
" + addr [0] +"], \ n ** Willkommen zum Server ** \ n -server \ n
| ------------------------------ | \ n \ n \ n "

Dieser Code soll eine Nachricht zum Senden an den Client erstellen. Diese Nachricht sollte auf dem Client -Terminal gedruckt werden. Dies bestätigt, dass der Client mit dem Server kommunizieren kann.

Conn.Senden (msg.kodieren())

Jetzt haben wir die Nachricht bereit und senden sie dann mit dieser an den Client "Conn". Dieser Code senden tatsächlich eine Nachricht an den Client.

Recvdata = conn.recv (1024)

Dieser Code empfängt alle Daten, die von der Client -Seite gesendet werden. In unserem Fall erwarten wir den Inhalt der Stichprobe.txt in "Recvdata".

während recvdata:

Noch eine, während die Schleife mit Bedingung recvdata nicht leer ist. In unserem Fall ist es nicht leer.

Datei.schreiben (recvdata)

Sobald wir Inhalte im Inneren haben "Recvdata" Dann schreiben wir in diese Datei “Recv.txt" Verwenden von Dateizeiger "Datei".

Recvdata = conn.recv (1024)

Versuchen Sie erneut zu empfangen, wenn Daten vom Client vorhanden sind. Einmal "Recvdata" hat keine Daten.

Datei.schließen()

Dadurch schließt der Dateizeiger einfach, wie wir mit Datei schreiben sind.

Conn.schließen()

Dies schließt die Verbindung mit dem Kunden.

brechen

Dies soll von unendlich in B_SERVER in unendlicher Schleife herauskommen.

  1. Klient.PY:
Importsystem

Importieren der SYS -Bibliothek, da wir Argumentanlagen in Python verwenden möchten.

if (len (sys.argv)> 1):
Serverip = sys.Argv [1]
anders:
print ("\ n \ n wie \ n python3 client ausführen.py \ n \ n ")
Ausgang (1)

Wenn wir die IP -Adresse von B_SERVER nach dem Dateinamen -Client übergeben.Py Während des Ausführens müssen wir diese Server -IP -Adresse im Client fangen.

… Wenn (Len (sys.Argv)> 1): => Um sicherzustellen "Serverip".

Wenn der Benutzer nicht mindestens einen Argumentcode übergibt, zeigt Hilfe und kommt aus dem Code heraus.

Port = 9898

Dies muss der gleiche Port sein, der auf der B_SERVER -Seite erwähnt wird.

S.Connect ((Serverip, Port))

Dieser Code führt die TCP -Verbindung zum Server -IP mit diesem Port durch. An diesem Ponint -Ergebnis ist etwas auszusetzen zu Fehlern im Zusammenhang.

Datei = open ("Beispiel.txt "," rb ")

Wir öffnen „Probe“.txt ”im Lesemodus, um nur Inhalte zu lesen.

SendData = Datei.Read (1024)

Lesen Sie den Inhalt der Datei und einfügen “Daten senden" Variable.

während sendData:

Wir starten eine während der Schleife, wenn “Daten senden" hat Daten. In unserem Fall, wenn „Beispiele“.txt ”ist nicht leer, es sollte Daten haben.

S.send (sendData)

Jetzt können wir Inhalte von senden "Probe.txt" zum Server mithilfe des Socket -Objekts "S".

SendData = Datei.Read (1024)

Nochmals lesen, wenn noch etwas übrig ist. Es gibt also nichts zu lesen aus der Datei "Daten senden" wird leer sein und es wird aus der Schleife herauskommen.

S.schließen()

Dies schließt die Verbindung nicht von der Client -Seite.

Ubuntu Screenshots Serverseite

Ubuntu Screenshots Client -Seite

Getestete Kombinationen:

  • Linux als Server und Linux als Client: Pass passieren
  • Linux als Client und Linux als Server: Pass passieren
  • Linux als Server und Windows10 als Client: Pass passieren
  • Linux als Client und Windows10 als Server: Pass passieren

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

Erwartete Fehler:

  1. Sie können unten Fehler sehen, wenn der Server nicht auf 9898 Port ausgeführt wird

Traceback (letzte Anruflast):

Datei "Client.py ", Zeile 22, in
S.Connect ((Serverip, Port))
ConnectionRefusedError: [Errno 111] Verbindung abgelehnt
  1. Nachfolgend ist der Fehler zu sehen, ob die IP -Adresse nicht an der Client -Seite übergeben wird

Rennen wie

Python3 -Kunde.py < serverip address >
  1. Der folgende Fehler ist zu sehen, ob 1st Argument auf der Clientseite ist keine IP -Adresse

Traceback (letzte Anruflast):

Datei "Client.py ", Zeile 22, in
S.Connect ((Serverip, Port))
Steckdose.Gaierror: [Errno -2] Name oder Dienst nicht bekannt
  1. Der folgende Fehler ist zu sehen, ob der Port wie 98980 verwendet wird

Traceback (letzte Anruflast):

Datei "Client.py ", Zeile 22, in
S.Connect ((Serverip, Port))
Überblowerror: Getockaddrarg: Port muss 0-65535 sein.
  1. Der folgende Fehler wird festgestellt, ob „Beispiele.txt ”ist nicht auf der Client -Seite vorhanden.

Traceback (letzte Anruflast):

Datei "Client.py ", Zeile 25, in
Datei = open ("Beispiel.txt "," rb ")
FilenotFoundError: [Errno 2] Keine solche Datei oder Verzeichnis: 'Beispiel.txt'

Abschluss:

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