Python Socket File Transfer Send

Python Socket File Transfer Send
Intensjonen med denne artikkelen er å lære Hvordan overføre en tekstfil over nettverk via Python -programmet. Denne filoverføringen er basert på serverklientmodell for å bruke socket -programmering i Python3+.

Grunnleggende oppsett diagram:

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 til stede på serversystemet. I vår case -server.PY skal være på B_server -systemet.

Ytterligere to filer klient.py og prøve.tekst skal være til stede på klientsystemet. I vårt tilfelle skal disse to filene være til stede på A_Client -systemet.

Antagelser:

Her er forutsetningene:

  • Vi bør ha to Linux -systemer med terminal tilgang.
  • Foretrukket Linux -smak er Ubuntu.
  • Python3 skal installeres.
  • Begge Linux -systemene skal i stand til å pinge hverandre. Bruk ping kommando for å sjekke ping.
  • Ett system skal fungere som server og annet system skal fungere som klient på et bestemt tidspunkt.

Begrensninger:

Før vi fortsetter 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å Python eldre versjoner.
  • Bare tekstfil kan overføres gjennom dette programmet per nå. Enhver annen formatfil som ikke inneholder tekst kan mislykkes.
  • Grunnleggende programmerings unntak er håndtert i programmet.
  • Programmet kan ikke kjøre på andre operativsystemer enn Ubuntu.
  • Tekstfilen skal være kort på klientsiden da bufferstørrelse på 1024 byte er blitt brukt.

Sett opp krav:

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

Serverkildekode:

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

Klientkildekode:

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

#!/usr/bin/env python3
# Importere biblioteker
Importkontakt
Importer Sys
# Lar oss fange 1. argument som server -IP
if (len (sys.argv)> 1):
Serverip = sys.Argv [1]
ellers:
print ("\ n \ n kjørt som \ n python3 -klient.py \ n \ n ")
Avslutt (1)
# Nå kan vi lage socketobjekt
S = stikkontakt.stikkontakt()
# Lar oss velge en port og koble til den porten
Port = 9898
# Lar oss koble til den porten der serveren kan kjøres
s.Connect ((Serverip, port))
# Vi kan sende filprøve.tekst
fil = åpen ("prøve.txt "," RB ")
SendData = fil.Les (1024)
Mens SendData:
# Nå kan vi motta data fra serveren
print ("\ n \ n ################# nedenfor melding mottas fra server ################# \ n \ n ", s.RECV (1024).Dekode ("UTF-8"))
#Now send innholdet i prøven.txt til server
s.Send (SendData)
SendData = fil.Les (1024)
# Lukk forbindelsen fra klientsiden
s.Lukk()

Hvordan kjøre programmer og forventet produksjon:

Her er trinnene for å utføre programmet.

Trinn1: Gå til B_server -systemet og åpne en terminal. Kortskjæring for å åpne en terminal er Alt+ctrl+t.

Trinn 2: Gå nå banen der serveren.py er til stede.

Trinn3: Kjør nå server.py som nedenfor

Python3 -server.py

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

Serveren oppføres på port: 9898

Kopiert filnavn vil være RECV.txt på serversiden

Trinn 4: Nå åpen terminal på A_Client System.

Trinn: Gå til banen der klienten.py og prøve.txt er til stede.

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

Python3 -klient.py

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

ifconfig

Nå skal utgangen av A_Client -systemet være slik

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

Trinn 7: Gå nå til B_Server og se etter utdata nedenfor

Filen er kopiert med hell
Serveren lukket tilkoblingen

Trinn 8: Det skal være ett filnavn RECV.txt i servermappen. Innholdet i denne RECV.TXT skal være samme prøve.tekst.

Så vi har kopiert en fil fra klient til server over nettverk gjennom Python -programmet.

Kodeforklaringer:

Det er to Python -filer server.py og klient.py.

Merk at vi vil forklare en gang om noen kode er den samme serveren.py og klient.py.

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

Dette er Shebang Line som betyr som standard denne serveren.PY skal bruke Python3. La oss se en fordel med denne linjen.

Vi har utført serveren.py eller klient.py som Python3 . Nå uten å bruke Python3 kan vi utføre Python -filen. Følg kommandoer nedenfor

Gå til superbrukermodus:

su

Gi all tillatelse til .PY -fil:

CHMOD 777 -server.py

Kjør server.PY:

./server.py
Importkontakt
#Importing socketbibliotek i Python -programmet når vi skal bruke stikkontakt til tilkobling.
S = stikkontakt.stikkontakt()

Vi lager et objekt “S” For å få tilgang til alle metoder for stikkontakt. Dette er et oops -konsept.

Port = 9898

Nå velger vi en port der serveren lytter. Vi kan bruke ikke reservert port i stedet for dette.

s.bind ((", port))

Vi bruker BIND -metoden for å binde server -IP -adresse til den porten [9898]. En observasjon er at vi kunne ha brukt eksakt IP -adresse til serveren i stedet for første argument for bindingsmetode, men vi velger å bli tomt, da dette arbeidet bra.

s.Bind ((IP -adresse, port))
fil = åpen ("Recv.TXT "," WB ")

Vi har åpnet ett filnavn “Recv.txt ”på server for skrivemodus og fikk filpeker. Dette kreves da vi må kopiere en tekstfil fra klienten.

Mens sant:

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 påkrevd.

conn, addr = s.aksepterer()

Denne koden er å godta enhver innkommende tilkoblingsforespørsel fra klienten. Conn vil bruke “Conn ” å kommunisere med klient og “Addr” er IP -adressen til klienten som har sendt oppstyr til denne serveren på port 9898.

msg = "\ n \ n | ------------------------------------- | \ n hei klient [IP-adresse:
" + addr [0] +"], \ n ** Velkommen til serveren ** \ n -server \ n
| ----------------------------- | \ n \ n \ n "

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

Conn.Send (MSG.kode ())

Nå har vi meldingen klar, og sender den til klienten ved å bruke den “Conn”. Denne koden sender faktisk melding til klienten.

RecvData = Conn.RECV (1024)

Denne koden mottar data som sendes fra klientsiden. I vårt tilfelle forventer vi innholdet i prøven.txt in “Recvdata”.

Mens recvdata:

En til mens sløyfe med tilstand recvdata er ikke tom. I vårt tilfelle er det ikke tomt.

fil.skriv (recvdata)

Når vi har innhold inne “Recvdata” Så skriver vi til den filen “Recv.tekst" Bruke filpeker "fil".

RecvData = Conn.RECV (1024)

Igjen prøver å motta hvis det er noen data fra klienten. En gang “Recvdata” har ingen data koden vil bryte mens loopen.

fil.Lukk()

Dette vil bare lukke filpekeren når vi er ferdig med filskriv.

Conn.Lukk()

Dette vil lukke forbindelsen med klienten.

gå i stykker

Dette skal komme ut fra uendelig mens du er sløyfe på B_server.

  1. klient.PY:
Importer Sys

Importerer SYS -bibliotek som vi vil bruke argumentanlegg i Python.

if (len (sys.argv)> 1):
Serverip = sys.Argv [1]
ellers:
print ("\ n \ n kjørt som \ n python3 -klient.py \ n \ n ")
Avslutt (1)

Når vi passerer IP -adresse til B_Server etter klient for filnavn.PY Mens vi kjører, må vi fange den serverens IP -adresse i klienten.

... hvis (len (sys.argv)> 1): => For å sikre at brukeren passerer minst ett argument som IP -adresse og fange den IP -adressen INSDIE “Serverip”.

Hvis brukeren ikke passerer minst en argumentkode, viser hjelp og kommer ut fra kode.

Port = 9898

Dette må være samme port som nevnt på B_server -siden.

s.Connect ((Serverip, port))

Denne koden vil gjøre TCP -tilkobling til Server IP med den porten. Noe som er galt på dette ponintet, resulterer i feil i forbindelse.

fil = åpen ("prøve.txt "," RB ")

Vi åpner “Sample.txt ”i lesemodus for bare å lese innhold.

SendData = fil.Les (1024)

Lese innholdet i filen og sette inn "SendData ” variabel.

Mens SendData:

Vi begynner en mens du er sløyfe hvis "SendData ” har data. I vårt tilfelle hvis "prøve.txt ”er ikke tomt, det skal ha data.

s.Send (SendData)

Nå kan vi sende innhold av "prøve.tekst" til server ved hjelp av socketobjekt “S”.

SendData = fil.Les (1024)

Igjen lesing hvis det er noe igjen. Så det vil ikke være noe å lese fra filen “Senddata” vil være tom og det kommer ut fra mens Loop.

s.Lukk()

Dette er ikke lukker forbindelsen fra klientsiden.

Ubuntu skjermbilder serverside

Ubuntu skjermbilder klientsiden

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 nedenfor feil hvis serveren ikke kjører på 9898 port

Traceback (siste samtale sist):

Fil "klient.py ", linje 22, i
s.Connect ((Serverip, port))
ConnectionRefusedError: [Errno 111] Tilkobling nektet
  1. Under feil sees hvis IP -adresse ikke sendes på klientsiden

Løp som

Python3 -klient.py < serverip address >
  1. Under feil sees hvis 1st Argument på klientsiden er ikke en IP -adresse

Traceback (siste samtale sist):

Fil "klient.py ", linje 22, i
s.Connect ((Serverip, port))
stikkontakt.GAIERROR: [Errno -2] Navn eller tjeneste ikke kjent
  1. Under feil sees hvis port brukes som 98980

Traceback (siste samtale sist):

Fil "klient.py ", linje 22, i
s.Connect ((Serverip, port))
Overflowerror: GetsockAddDrarg: Port må være 0-65535.
  1. Under feil sees hvis “prøve.TXT ”er ikke til stede på klientsiden.

Traceback (siste samtale sist):

Fil "klient.py ", linje 25, i
fil = åpen ("prøve.txt "," RB ")
FilenotFoundError: [Errno 2] Ingen slik fil eller katalog: 'Eksempel.tekst'

Konklusjon:

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