Send Python Socket -filoverførsel

Python Socket File Transfer Send



Hensigten med denne artikel er at lære hvordan man overfører en tekstfil over netværk via et python -program . Denne filoverførsel er baseret på serverklientmodel til brug af socketprogrammering i python3+.

Her er det grundlæggende opsætningsdiagram for at køre dette program.









For enkelheds skyld kalder vi System A som A_client og System B som B_server i hele artiklen.



Filkrav:

Vi behøver server.py og denne fil skal være til stede på serversystemet. I vores tilfælde skulle server.py være på B_server system.





Endnu to filer client.py og sample.txt skal være til stede i klientsystemet. I vores tilfælde skulle disse to filer være til stede på A_client -systemet.

Forudsætninger:

Her er antagelserne:



  • Vi skulle have to Linux -systemer med terminaladgang.
  • Foretrukken Linux -smag er Ubuntu .
  • Python3 skal installeres.
  • Begge Linux -systemer burde kunne pinge hinanden. Brug ping kommando for at kontrollere ping.
  • Et system bør fungere som server, og et andet system skal fungere som klient på et bestemt tidspunkt.

Begrænsninger:

Inden vi går videre, bør vi vide, at der er nogle begrænsninger ved dette program.

  • Python3+ skal installeres for at køre dette program. Du kan observere fejl eller anden adfærd, hvis den køres på ældre versioner af python.
  • Kun tekstfiler kan overføres via dette program fra nu af. Enhver anden formatfil, der ikke indeholder tekst, kan mislykkes.
  • Grundlæggende programmeringsundtagelser er blevet håndteret i programmet.
  • Programmet kører måske på et andet operativsystem end Ubuntu.
  • Tekstfil skal være kort på klientsiden, da bufferstørrelse på 1024 bytes er blevet brugt.

Opstil krav:

  • Vi har brug for mindst et Linux -system for at prøve dette program. Men anbefaling er at bruge to forskellige Linux -systemer, der er forbundet via netværk.
  • To systemer skal forbindes via Ethernet eller Wi-Fi eller andre forbindelser.

Serverens kildekode:

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

Kundens kildekode:

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

Sådan køres programmer og forventet output:

Her er trinene til at udføre programmet.

Trin 1: Gå til B_serversystem og åbn en terminal. Genvej til at åbne en terminal er Alt+Ctrl+t.

Trin 2: Gå nu den vej, hvor server.py er til stede.

Trin 3: Kør nu server.py som nedenfor

python3 server.py

Der bør ikke være fejl, og du skal se nedenstående udskrifter

Serveren er angivet på port: 9898

Kopieret filnavn vil blive recv.txt på serversiden

Trin4: Åbn nu terminal på A_client system.

Trin 5: Gå til den sti, hvor client.py og sample.txt er til stede.

Trin6: Kør nu client.py som nedenfor

python3 -klient.py <B_serversystem -IP>

Vi har observeret, at vi skal kende serverens IP -adresse. Vi kan udføre nedenstående kommando for at kende IP -adressen på B_serversystem.

ifconfig

Nu skal output fra A_client -system være sådan

################### Nedenstående besked modtages fra serveren ####################
| --------------------------------- |
Hej klient[IP -adresse: 192.168.1.102],
** Velkommen til serveren **
-Server
| --------------------------------- |

Trin7: Gå nu til B_server og kig efter output nedenfor

Filen er blevet kopieret
Serveren lukkede forbindelsen

Trin 8: Der skal være ét filnavn recv.txt i servermappen. Indholdet af denne recv.txt skal være den samme sample.txt.

Så vi har med succes kopieret en fil fra klient til server over netværk via python -program.

Kodeforklaringer:

Der er to python -filer server.py og client.py .

Bemærk, at vi vil forklare én gang, om en kode er den samme inde i server.py og client.py.

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

Dette er shebang -linje, hvilket betyder, at denne server.py som standard skal bruge python3. Lad os se en fordel ved denne linje.

Vi har udført server.py eller client.py som python3. Nu uden at bruge python3 kan vi eksekvere python -filen. Følg nedenstående kommandoer

Gå til superbruger -tilstand:

dens

Giv al tilladelse til .py -fil:

chmod777server.py

Kør server.py:

./server.py importere stikkontakt
Importererstikkontaktbibliotek til python -programsomvi tager afsted
at brugestikkontakt tilforbindelse.

s = stikkontakt.stikkontakt()

Vi skaber et objekt s for at få adgang til alle metoder til stikkontakt. Dette er et OOP -koncept.

HAVN= 9898

Nu vælger vi en port, hvor serveren vil lytte. Vi kan bruge ikke -reserveret port i stedet for denne.

s.binde(('',HAVN))

Vi bruger bindingsmetode til at binde serverens ip -adresse til den port [9898]. En observation er, at vi kunne have brugt serverens nøjagtige IP -adresse i stedet for det første argument for bindemetoden, men vi vælger at lade stå tomme, da dette fungerer fint.

s.binde((IP-adresse,HAVN))
fil = åben('recv.txt', 'wb')

Vi har åbnet et filnavn recv.txt i serveren til skrivemåde og fik filmarkør. Dette er påkrævet, da vi skal kopiere en tekstfil fra klienten.

mens Sand:

Lad os starte en uendelig mens loop som servers job er at vente, indtil en klient kommunikerer med serveren på den 9898 port. Så dette mens loop er påkrævet.

konn,addr=s.acceptere()

Denne kode er til at acceptere enhver indgående forbindelsesanmodning fra klienten. Conn vil bruge konn at kommunikere med klient og addr er klientens IP -adresse, der har sendt opfordring til denne server på port 9898.

besked= ' n n| --------------------------------- | nHej klient [IP -adresse:
'
+ addr[0]+'], n** Velkommen til serveren ** n-Server n
| --------------------------------- | n n n'

Denne kode er til at oprette en besked, der skal sendes til klienten. Denne meddelelse skal udskrives på klientterminalen. Dette bekræfter, at klienten er i stand til at kommunikere med serveren.

konn.sende(beskedkode())

Nu har vi beskeden klar, og sender den derefter til klienten ved hjælp af det konn. Denne kode sender faktisk besked til klienten.

RecvData=konn.recv(1024)

Denne kode modtager alle data, der sendes fra klientsiden. I vores tilfælde forventer vi indholdet af sample.txt i RecvData .

mensRecvData:

Endnu en mens loop med betingelse RecvData ikke er tom. I vores tilfælde er det ikke tomt.

fil.skrive(RecvData)

Når vi har indhold inde RecvData så skriver vi til den fil recv.txt ved hjælp af filmarkøren fil.

RecvData=konn.recv(1024)

Igen forsøger at modtage, hvis der er data fra klienten. Enkelt gang RecvData har ingen data, vil koden bryde while -sløjfen.

fil.tæt()

Dette lukker bare filmarkøren, da vi er færdige med filskrivning.

konn.tæt()

Dette vil lukke forbindelsen til klienten.

pause

Dette skal komme fra uendelig mens loop på B_server.

  1. client.py:
importere sys

Importere sys bibliotek, som vi vil bruge argumentfacilitet i python.

hvis (len(sys.argv) > 1):
ServerIp= sys.argv[1]
andet:
Print(' n nKør som npython3 client.py n n')
Afslut(1)

Da vi videregiver B_servers IP -adresse efter filnavnet client.py, mens vi kører, skal vi fange serverens IP -adresse inde i klienten.

... ..if (len (sys.argv)> 1): => For at sikre, at brugeren sender mindst ét ​​argument som IP -adresse og fanger den IP -adresse insdie ServerIP.

Hvis brugeren ikke sender mindst én argumentkode viser hjælp og kommer ud af kode.

HAVN= 9898

Dette skal være den samme port som nævnt på B_serversiden.

s.forbinde((ServerIp,HAVN))

Denne kode udfører TCP -forbindelse til serverens IP med den port. Alt forkert ved denne ponint resulterer i fejl i forbindelse.

fil = åben('sample.txt', 'rb')

Vi åbner sample.txt i læsetilstand for kun at læse indhold.

SendData= fil.Læs(1024)

Læser filens indhold og lægger det ind SendData variabel.

mensSendData:

Vi starter en while loop hvis SendData har data. I vores tilfælde, hvis sample.txt ikke er tomt, skal det have data.

s.sende(SendData)

Nu kan vi sende indhold af sample.txt til serveren ved hjælp af socketobjekt s.

SendData= fil.Læs(1024)

Læser igen, hvis der er noget tilbage. Så der vil ikke være noget at læse fra filen SendData vil være tom, og den kommer ud af mens loop.

s.tæt()

Dette lukker ikke forbindelsen fra klientsiden.

Ubuntu Screenshots Server side

Ubuntu Screenshots Klientside

Testede kombinationer:

  • Linux som server og Linux som klient: PASS
  • Linux som klient og Linux som server: PASS
  • Linux som server og Windows10 som klient: PASS
  • Linux som klient og Windows10 som server: PASS

Anbefalingen er at bruge to Linux -systemer til server og klient.

Forventede fejl:

  1. Du kan se fejlen herunder, hvis serveren ikke kører på 9898 -porten

Spor tilbage (seneste opkald sidste):

Fil'client.py',linje22, i <modul>
s.forbinde((ServerIp,HAVN))
ConnectionRefusedError:[Errno111]Forbindelse nægtet
  1. Nedenstående fejl ses, hvis IP -adressen ikke videregives på klientsiden

Kør som

python3 -klient.py <serverip adresse>
  1. Nedenstående fejl ses, hvis 1stargument på klientsiden er ikke en IP -adresse

Spor tilbage (seneste opkald sidste):

Fil'client.py',linje22, i <modul>
s.forbinde((ServerIp,HAVN))
stikkontakt.gaierror:[Errno -2]Navnellerserviceikkekendt
  1. Nedenfor ses fejlen, hvis port bruges som 98980

Spor tilbage (seneste opkald sidste):

Fil'client.py',linje22, i <modul>
s.forbinde((ServerIp,HAVN))
OverflowError: getsockaddrarg: port skal være0-65535.
  1. Nedenstående fejl ses, hvis sample.txt ikke er til stede på klientsiden.

Spor tilbage (seneste opkald sidste):

Fil'client.py',linje25, i <modul>
fil = åben('sample.txt', 'rb')
FileNotFoundError:[Errno2]Ikke sådanfil ellervejviser:'sample.txt'

Konklusion:

Ved hjælp af dette program kan vi sende en simpel tekstfil fra et system til et andet system via netværk ved hjælp af python -program. Dette giver os grundlæggende læring af python- og socketprogrammering også til at sende data over netværk.