Send Python Socket File Transfer

Python Socket File Transfer Send



Intensjonen med denne artikkelen er å lære hvordan overføre en tekstfil over nettverk via python -program . Denne filoverføringen er basert på serverklientmodell for å bruke socketprogrammering i python3+.

Her er det grunnleggende oppsettdiagrammet for å kjøre dette programmet.









For enkelhets skyld vil vi kalle System A som A_client og System B som B_server gjennom hele artikkelen.



Filkrav:

Vi trenger server.py og denne filen skal være tilstede på serversystemet. I vårt tilfelle bør server.py være på B_server -systemet.





Ytterligere to filer client.py og sample.txt skal være tilstede i klientsystemet. I vårt tilfelle bør de to filene være tilstede på A_client -systemet.

Antagelser:

Her er forutsetningene:



  • Vi bør ha to Linux -systemer med terminaladgang.
  • Foretrukket Linux -smak er Ubuntu .
  • Python3 bør installeres.
  • Begge Linux -systemene burde kunne pinge hverandre. Bruk ping kommando for å kontrollere ping.
  • Ett system skal fungere som server, og et annet system bør fungere som klient på et bestemt tidspunkt.

Begrensninger:

Før vi går videre bør vi vite at det er noen begrensninger i dette programmet.

  • Python3+ bør installeres for å kjøre dette programmet. Du kan observere feil eller annen oppførsel hvis du kjører på eldre versjoner av python.
  • Bare tekstfiler kan overføres via dette programmet per nå. Enhver annen formatfil som ikke inneholder tekst kan mislykkes.
  • Grunnleggende programmeringsunntak har blitt håndtert i programmet.
  • Programmet kan kjøres på et annet operativsystem enn Ubuntu.
  • Tekstfilen skal være kort på klientsiden ettersom bufferstørrelsen på 1024 byte er brukt.

Sett opp krav:

  • Vi trenger minst ett Linux -system for å prøve dette programmet. Men anbefalingen er å bruke to forskjellige Linux -systemer som er koblet til via nettverk.
  • To systemer bør kobles til via Ethernet eller Wi-Fi eller andre tilkoblinger.

Serverens kildekode:

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

Klientens kildekode:

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

Slik kjører du programmer og forventet utgang:

Her er trinnene for å utføre programmet.

Trinn 1: Gå til B_serversystem og åpne en terminal. Snarvei for å åpne en terminal er Alt+Ctrl+t.

Trinn 2: Gå nå banen der server.py er tilstede.

Trinn 3: Kjør nå server.py som nedenfor

python3 server.py

Det skal ikke være noen feil, og du bør se utskrifter nedenfor

Serveren er oppført på port: 9898

Det kopierte filnavnet blir recv.txt på serversiden

Trinn 4: Åpne nå terminalen på A_client -systemet.

Trinn 5: Gå til banen der client.py og sample.txt er tilstede.

Trinn 6: Kjør nå client.py som nedenfor

python3 -klient.py <B_serversystem -IP>

Vi har observert at vi må kjenne serverens IP -adresse. Vi kan utføre kommandoen nedenfor for å kjenne IP -adressen til B_server -systemet.

ifconfig

Nå skal utdataene fra A_client -systemet være slik

################### Under melding mottas fra server ###################
| --------------------------------- |
Hei klient[IP -adresse: 192.168.1.102],
** Velkommen til server **
-Server
| --------------------------------- |

Trinn 7: Gå nå til B_server og se etter utdataene nedenfor

Filen er kopiert
Serveren stengte tilkoblingen

Trinn 8: Det bør være ett filnavn recv.txt i servermappen. Innholdet i denne recv.txt skal være samme sample.txt.

Så vi har vellykket kopiert en fil fra klient til server over nettverk gjennom python -program.

Kodeforklaringer:

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

Vær oppmerksom på at vi vil forklare én gang om noen kode er den samme inne i server.py og client.py.

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

Dette er shebang -linje, noe som betyr at denne server.py som standard skal bruke python3. La oss se en fordel med denne linjen.

Vi har kjørt server.py eller client.py som python3. Nå uten å bruke python3 kan vi kjøre python -filen. Følg kommandoene nedenfor

Gå til superbrukermodus:

det er

Gi all tillatelse til .py -fil:

chmod777server.py

Kjør server.py:

./server.py import stikkontakt
Importererstikkontaktbibliotek til python -programsomVi skal
å brukestikkontakt tilforbindelse.

s = stikkontakt.stikkontakt()

Vi lager et objekt s for å få tilgang til alle metoder for stikkontakt. Dette er et OOP -konsept.

HAVN= 9898

Nå velger vi en port der serveren skal lytte. Vi kan bruke ikke -reservert port i stedet for denne.

s.binde(('',HAVN))

Vi bruker bindingsmetode for å binde serverens ip -adresse til den porten [9898]. En observasjon er at vi kunne ha brukt eksakt IP -adresse til serveren i stedet for det første argumentet for bindemetode, men vi velger å la det stå tomt, da dette fungerer fint.

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

Vi har åpnet ett filnavn recv.txt i server for skrivemodus og fikk filpeker. Dette er nødvendig da vi må kopiere en tekstfil fra klienten.

samtidig som ekte:

La oss starte en uendelig mens loop som serverens jobb er å vente til en klient kommuniserer med serveren på den 9898 -porten. Så dette mens sløyfe er nødvendig.

konn,addr=s.aksepterer()

Denne koden er for å godta enhver forespørsel om innkommende tilkobling fra klienten. Conn vil bruke konn å kommunisere med klient og addr er IP -adressen til klienten som har sendt oppstyrsforespørsel til denne serveren på port 9898.

melding= ' n n| --------------------------------- | nHei klient [IP -adresse:
'
+ addr[0]+'], n** Velkommen til server ** n-Server n
| --------------------------------- | n n n'

Denne koden er for å lage en melding som skal sendes til klienten. Denne meldingen skal skrives ut på klientterminalen. Dette bekrefter at klienten er i stand til å kommunisere med serveren.

konn.sende(meldingkode())

Nå har vi meldingen klar, og sender den deretter til klienten ved hjelp av den konn. Denne koden sender faktisk melding til klienten.

RecvData=konn.rekv(1024)

Denne koden mottar data som sendes fra klientsiden. I vårt tilfelle forventer vi innholdet i sample.txt in RecvData .

samtidig somRecvData:

Nok en mens loop med betingelse RecvData ikke er tom. I vårt tilfelle er det ikke tomt.

fil.skrive(RecvData)

Når vi har innhold inne RecvData så skriver vi til den filen recv.txt ved hjelp av filpeker fil.

RecvData=konn.rekv(1024)

Prøv igjen å motta hvis det er data fra klienten. En gang RecvData har ingen data, vil koden bryte mens loop.

fil.Lukk()

Dette vil bare lukke filmarkøren mens vi er ferdige med filskriving.

konn.Lukk()

Dette vil lukke forbindelsen til klienten.

gå i stykker

Dette skal komme ut fra uendelig mens loop på B_server.

  1. client.py:
import sys

Importere sys bibliotek som vi vil bruke argumentfasilitet i python.

hvis (len(sys.argv) > 1):
ServerIp= sys.argv[1]
ellers:
skrive ut(' n nLøp som npython3 client.py n n')
exit(1)

Når vi sender IP -adressen til B_server etter filnavnet client.py mens vi kjører, må vi fange den serverens IP -adresse inne i klienten.

... ..if (len (sys.argv)> 1): => For å sikre at brukeren sender minst ett argument som IP -adresse og fanger den IP -adressen insdie ServerIP.

Hvis brukeren ikke passerer minst én argumentkode viser hjelp og kommer ut av koden.

HAVN= 9898

Dette må være den samme porten som nevnt på B_serversiden.

s.koble((ServerIp,HAVN))

Denne koden vil gjøre TCP -tilkobling til serverens IP med den porten. Noe feil ved denne poninten resulterer i feil i forbindelse.

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

Vi åpner sample.txt i lesemodus for å lese innhold.

SendData= fil.lese(1024)

Lese innholdet i filen og sette den inn SendData variabel.

samtidig somSendData:

Vi starter en mens loop hvis SendData har data. I vårt tilfelle hvis sample.txt ikke er tomt, bør det ha data.

s.sende(SendData)

Nå kan vi sende innhold av sample.txt til server ved hjelp av socketobjekt s.

SendData= fil.lese(1024)

Les igjen om det er noe igjen. Så det blir ingenting å lese fra filen SendData vil være tom, og den kommer ut fra mens loop.

s.Lukk()

Dette lukker ikke forbindelsen fra klientsiden.

Ubuntu Screenshots Server side

Ubuntu Screenshots Klientside

Testede kombinasjoner:

  • 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 å bruke to Linux -systemer for server og klient.

Forventede feil:

  1. Du kan se feilen nedenfor hvis serveren ikke kjører på 9898 -porten

Spor tilbake (siste samtale sist):

Fil'client.py',linje22, i <modul>
s.koble((ServerIp,HAVN))
ConnectionRefusedError:[Errno111]Tilkobling nektet
  1. Nedenfor vises feilen hvis IP -adressen ikke blir sendt på klientsiden

Løp som

python3 -klient.py <serverip -adresse>
  1. Nedenfor vises feilen hvis 1stargumentet på klientsiden er ikke en IP -adresse

Spor tilbake (siste samtale sist):

Fil'client.py',linje22, i <modul>
s.koble((ServerIp,HAVN))
stikkontakt.gaierror:[Errno -2]Navnellerserviceikkekjent
  1. Nedenfor vises feilen hvis porten er som 98980

Spor tilbake (siste samtale sist):

Fil'client.py',linje22, i <modul>
s.koble((ServerIp,HAVN))
OverflowError: getsockaddrarg: port må være0-65535.
  1. Nedenfor vises feilen hvis sample.txt ikke er tilstede på klientsiden.

Spor tilbake (siste samtale sist):

Fil'client.py',linje25, i <modul>
fil = åpen('sample.txt', 'rb')
FileNotFoundError:[Errno2]Ingenting somfil ellerkatalog:'sample.txt'

Konklusjon:

Ved å bruke dette programmet kan vi sende en enkel tekstfil fra ett system til et annet system via nettverk ved hjelp av python -program. Dette gir oss grunnleggende læring av python- og socket -programmering også for å sende data over nettverk.