Python Socket Bestandsoverdracht Verzenden

Python Socket File Transfer Send



De bedoeling van dit artikel is om te leren hoe een tekstbestand via het netwerk over te zetten via het python-programma . Deze bestandsoverdracht is gebaseerd op het serverclientmodel om socketprogrammering in python3+ te gebruiken.

Hier is het basisopstellingsschema om dit programma uit te voeren.









Voor de eenvoud noemen we Systeem A in het hele artikel als A_client en Systeem B als B_server.



Bestandsvereisten:

Wij hebben nodig server.py en dit bestand moet aanwezig zijn op het serversysteem. In ons geval zou server.py op het B_server-systeem moeten staan.





Nog twee bestanden client.py en voorbeeld.txt aanwezig moeten zijn op het clientsysteem. In ons geval zouden die twee bestanden aanwezig moeten zijn op het A_client-systeem.

Veronderstellingen:

Dit zijn de aannames:



  • We zouden twee Linux-systemen moeten hebben met terminaltoegang.
  • De voorkeur voor Linux-smaak is: Ubuntu .
  • Python3 moet worden geïnstalleerd.
  • Beide Linux-systemen zouden elkaar moeten kunnen pingen. Gebruik maken van ping commando om de ping te controleren.
  • Het ene systeem moet op een bepaald moment als server fungeren en het andere systeem als client.

Beperkingen:

Voordat we verder gaan, moeten we weten dat er enkele beperkingen zijn aan dit programma.

  • Python3+ moet geïnstalleerd zijn om dit programma uit te voeren. U kunt fouten of ander gedrag waarnemen als u op oudere python-versies draait.
  • Vanaf nu kunnen alleen tekstbestanden via dit programma worden overgedragen. Elk ander formaatbestand dat geen tekst bevat, kan mislukken.
  • Basisprogrammeeruitzonderingen zijn in het programma verwerkt.
  • Het programma kan wel of niet op een ander besturingssysteem dan Ubuntu draaien.
  • Het tekstbestand moet aan de clientzijde kort zijn, aangezien er een buffergrootte van 1024 bytes is gebruikt.

Vereisten instellen:

  • We hebben minimaal één Linux-systeem nodig om dit programma uit te proberen. Maar de aanbeveling is om twee verschillende Linux-systemen te gebruiken die via een netwerk zijn verbonden.
  • Twee systemen moeten worden verbonden via Ethernet of Wi-Fi of andere verbindingen.

Serverbroncode:

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

Broncode klant:

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

Hoe programma's en verwachte output uit te voeren:

Hier zijn de stappen om het programma uit te voeren.

Stap1: Ga naar B_server-systeem en open een terminal. Snelkoppeling om een ​​terminal te openen is Alt+Ctrl+t.

Stap 2: Ga nu naar het pad waar server.py aanwezig is.

Stap 3: Voer nu server.py uit zoals hieronder:

python3-server.py

Er mogen geen fouten zijn en u zou onderstaande afdrukken moeten zien

Server vermeldt op poort: 9898

De naam van het gekopieerde bestand is recv.txt aan de serverzijde

Stap 4: Open nu terminal op A_client-systeem.

Stap 5: Ga naar het pad waar client.py en sample.txt aanwezig zijn.

Stap 6: Voer nu client.py uit zoals hieronder:

python3-client.py <B_server systeem IP>

We hebben geconstateerd dat we het IP-adres van de server moeten weten. We kunnen onderstaande opdracht uitvoeren om het IP-adres van het B_server-systeem te kennen.

ifconfig

Nu zou de uitvoer van het A_client-systeem zo moeten zijn:

################## Onderstaand bericht is ontvangen van de server ##################
--------------------------------- |
Hallo klant[IP-adres: 192.168.1.102],
**Welkom bij server**
-Server
--------------------------------- |

Stap 7: Ga nu naar B_server en zoek naar onderstaande uitvoer

Bestand is succesvol gekopieerd
Server heeft de connectie gesloten

Stap 8: Er zou één bestandsnaam recv.txt moeten zijn in de servermap. De inhoud van deze recv.txt moet dezelfde sample.txt zijn.

We hebben dus met succes een bestand gekopieerd van client naar server via het netwerk via het python-programma.

Code uitleg:

Er zijn twee python-bestanden server.py en client.py .

Merk op dat we één keer zullen uitleggen of een code hetzelfde is in server.py en client.py.

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

Dit is een shebang-regel, wat betekent dat deze server.py standaard python3 moet gebruiken. Laten we een voordeel van deze lijn bekijken.

We hebben de server.py of client.py like . uitgevoerd python3 . Nu kunnen we zonder python3 te gebruiken het python-bestand uitvoeren. Volg onderstaande commando's:

Ga naar de supergebruikersmodus:

zijn

Geef alle toestemming aan het .py-bestand:

chmod777server.py

Voer server.py uit:

./server.py importeren stopcontact
Importerenstopcontactbibliotheek in python-programmaalswe gaan
gebruikenstopcontact voorverbinding.

s = stopcontact.stopcontact()

We maken een object s om toegang te krijgen tot alle socketmethoden. Dit is een OOPs-concept.

HAVEN= 9898

Nu kiezen we een poort waar de server zal luisteren. We kunnen in plaats daarvan een niet-gereserveerde poort gebruiken.

s.binden(('',HAVEN))

We gebruiken de bind-methode om het ip-adres van de server aan die poort te binden [9898]. Een observatie is dat we het exacte IP-adres van de server hadden kunnen gebruiken in plaats van het eerste argument van de bindmethode, maar we kiezen ervoor om dit leeg te laten omdat dit prima werkt.

s.binden((IP adres,HAVEN))
het dossier = open('recv.txt', 'wb')

We hebben één bestandsnaam recv.txt geopend in de server voor schrijfmodus en hebben een bestandsaanwijzer. Dit is vereist omdat we één tekstbestand van de klant moeten kopiëren.

terwijl Waar:

Laten we een oneindige while-lus starten, aangezien het de taak van de server is om te wachten tot een client communiceert met de server op die 9898-poort. Dus deze while-lus is vereist.

conn,adres=s.aanvaarden()

Deze code is om elk inkomend verbindingsverzoek van de klant te accepteren. Conn zal gebruiken conn communiceren met de klant en adres is het IP-adres van de client die een commotieverzoek naar deze server op poort 9898 heeft verzonden.

bericht= 'NN--------------------------------- |NHallo klant [IP-adres:
'
+ adres[0]+'],N**Welkom bij server**N-ServerN
--------------------------------- |N NN'

Deze code is om een ​​bericht te maken om naar de klant te sturen. Dit bericht moet worden afgedrukt op de clientterminal. Dit bevestigt dat de client kan communiceren met de server.

conn.versturen(bericht.coderen())

Nu hebben we het bericht klaar en sturen het vervolgens naar de klant met dat conn. Deze code stuurt daadwerkelijk een bericht naar de klant.

RecvData=conn.recv(1024)

Deze code ontvangt alle gegevens die vanaf de client worden verzonden. In ons geval verwachten we de inhoud van sample.txt in RecvData .

terwijlRecvData:

Nog een while-lus met voorwaarde RecvData is niet leeg. In ons geval is het niet leeg.

het dossier.schrijven(RecvData)

Zodra we inhoud binnen hebben RecvData dan schrijven we naar dat bestand recv.txt bestandsaanwijzer gebruiken het dossier.

RecvData=conn.recv(1024)

Opnieuw proberen te ontvangen of er gegevens van de klant zijn. Een keer RecvData geen gegevens heeft, zal de code de while-lus doorbreken.

het dossier.dichtbij()

Dit zal gewoon de bestandsaanwijzer sluiten zoals we klaar zijn met het schrijven van bestanden.

conn.dichtbij()

Hiermee wordt de verbinding met de klant verbroken.

pauze

Dit komt uit een oneindige while-lus op B_server.

  1. klant.py:
importeren sys

Sys-bibliotheek importeren zoals we willen, gebruik de argumentfaciliteit in python.

indien (len(sys.argv) > 1):
Server IP= sys.argv[1]
anders:
afdrukken('NNRennen alsNpython3 client.pyNN')
Uitgang(1)

Terwijl we het IP-adres van B_server doorgeven na de bestandsnaam client.py tijdens het uitvoeren, moeten we dat IP-adres van de server in de client vangen.

…..if (len(sys.argv) > 1): => Om ervoor te zorgen dat de gebruiker ten minste één argument als IP-adres doorgeeft en dat IP-adres insdie opvangt Server IP.

Als de gebruiker niet ten minste één argument doorgeeft, geeft de code hulp weer en komt uit de code.

HAVEN= 9898

Dit moet dezelfde poort zijn als vermeld aan de kant van B_server.

s.aansluiten((Server IP,HAVEN))

Deze code maakt een TCP-verbinding met het server-IP met die poort. Alles wat op dit punt verkeerd is, leidt tot storingen in de verbinding.

het dossier = open('voorbeeld.txt', 'rb')

We openen sample.txt in leesmodus om alleen inhoud te lezen.

Verstuur data= het dossier.lezen(1024)

De inhoud van het bestand lezen en erin plaatsen Verstuur data variabel.

terwijlVerstuur data:

We beginnen een while-lus als Verstuur data gegevens heeft. In ons geval, als sample.txt niet leeg is, zou het gegevens moeten bevatten.

s.versturen(Verstuur data)

Nu kunnen we inhoud verzenden van voorbeeld.txt naar server met behulp van socket-object s.

Verstuur data= het dossier.lezen(1024)

Nog een keer lezen of er nog iets over is. Er zal dus niets uit het bestand kunnen worden gelezen Verstuur data is leeg en komt uit de while-lus.

s.dichtbij()

Dit is niet het sluiten van de verbinding vanaf de clientzijde.

Ubuntu-schermafbeeldingen Serverzijde

Ubuntu-schermafbeeldingen Clientzijde

Geteste combinaties:

  • Linux als server en Linux als client: PASS
  • Linux als client en Linux als server: PASS
  • Linux als server en Windows10 als client: PASS
  • Linux als client en Windows10 als server: PASS

De aanbeveling is om twee Linux-systemen te gebruiken voor server en client.

Verwachte fouten:

  1. U kunt de onderstaande fout zien als de server niet op poort 9898 draait:

Hertraceren (meest recente oproep als laatste)

Bestand'klant.py',lijn22, in <module>
s.aansluiten((Server IP,HAVEN))
ConnectionRefusedError:[errno111]Verbinding geweigerd
  1. Onderstaande fout wordt gezien als het IP-adres niet wordt doorgegeven aan de clientzijde

Rennen als

python3-client.py <server IP adres>
  1. Onderstaande fout wordt gezien als 1NSargument aan clientzijde is geen IP-adres

Hertraceren (meest recente oproep als laatste)

Bestand'klant.py',lijn22, in <module>
s.aansluiten((Server IP,HAVEN))
stopcontact.gaierror:[Errno -2]Naamofonderhoudnietbekend
  1. Onderstaande fout wordt gezien als de poort wordt gebruikt zoals 98980

Hertraceren (meest recente oproep als laatste)

Bestand'klant.py',lijn22, in <module>
s.aansluiten((Server IP,HAVEN))
Overloopfout: getockaddrarg: poort moet zijn0-65535.
  1. Onderstaande fout wordt gezien als sample.txt niet aanwezig is aan de clientzijde.

Hertraceren (meest recente oproep als laatste)

Bestand'klant.py',lijn25, in <module>
het dossier = open('voorbeeld.txt', 'rb')
FileNotFoundError:[errno2]niet zoietshet dossier ofmap:'voorbeeld.txt'

Conclusie:

Met behulp van dit programma kunnen we een eenvoudig tekstbestand van het ene systeem naar een ander systeem sturen via een netwerk met behulp van het python-programma. Dit geeft ons basiskennis van python- en socket-programmering, ook voor het verzenden van gegevens via het netwerk.