Pošlji prenos datotek vtičnice Python

Python Socket File Transfer Send



Namen tega članka je učenje kako prenesti besedilno datoteko po omrežju prek programa python . Ta prenos datotek temelji na modelu odjemalca strežnika za uporabo programiranja vtičnic v python3+.

Tu je osnovni diagram nastavitve za zagon tega programa.









Zaradi preprostosti bomo v celotnem članku klicali sistem A kot A_client in sistem B kot strežnik B_.



Zahteve za datoteke:

Potrebujemo server.py in ta datoteka mora biti prisotna v strežniškem sistemu. V našem primeru mora biti server.py v sistemu B_server.





Še dve datoteki client.py in sample.txt mora biti prisoten v sistemu odjemalca. V našem primeru bi morali biti ti dve datoteki prisotni v sistemu A_client.

Predpostavke:

Tu so predpostavke:



  • Morali bi imeti dva sistema Linux s terminalskim dostopom.
  • Najboljši okus Linuxa je Ubuntu .
  • Namestiti je treba Python3.
  • Oba sistema Linux bi se morala medsebojno pingati. Uporaba ping ukaz za preverjanje pinga.
  • En sistem bi moral delovati kot strežnik, drugi sistem pa bi moral hkrati delovati kot odjemalec.

Omejitve:

Preden nadaljujemo, bi morali vedeti, da obstajajo nekatere omejitve tega programa.

  • Za zagon tega programa je treba namestiti Python3+. Če zaženete starejše različice pythona, lahko opazite napako ali drugačno vedenje.
  • S tem programom je trenutno mogoče prenesti samo besedilno datoteko. Vsaka druga oblika zapisa datoteke, ki ne vsebuje besedila, lahko ne uspe.
  • V programu so bile obravnavane osnovne izjeme pri programiranju.
  • Program se lahko izvaja ali ne v drugih operacijskih sistemih, razen v Ubuntuju.
  • Besedilna datoteka mora biti kratka na strani odjemalca, saj je bila uporabljena velikost vmesnega pomnilnika 1024 bajtov.

Nastavite zahteve:

  • Za preizkus tega programa potrebujemo vsaj en sistem Linux. Priporočamo pa, da uporabite dva različna sistema Linux, ki sta povezana prek omrežja.
  • Dva sistema morata biti povezana prek Etherneta ali Wi-Fi ali katere koli druge povezave.

Izvorna koda strežnika:

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

Izvorna koda odjemalca:

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

Kako zagnati programe in pričakovane rezultate:

Tu so koraki za izvedbo programa.

1. korak: Pojdite na sistem B_server in odprite terminal. Bližnjica za odpiranje terminala je Alt+Ctrl+t.

2. korak: Zdaj pojdite na pot, kjer je prisoten server.py.

Korak 3: Zdaj zaženite server.py, kot je prikazano spodaj

strežnik python3.py

Napak ne bi smelo biti, spodaj bi morali videti odtise

Strežnik je na seznamu vrat: 9898

Kopirano ime datoteke bo recv.txt na strani strežnika

4. korak: Zdaj odprite terminal v sistemu A_client.

5. korak: Pojdite na pot, kjer sta prisotna client.py in sample.txt.

Korak 6: Zdaj zaženite client.py, kot je prikazano spodaj

odjemalec python3.py <IP sistema B_ strežnika>

Opazili smo, da moramo poznati naslov IP strežnika. Spodnji ukaz lahko izvedemo, da poznamo naslov IP sistema B_server.

ifconfig

Zdaj bi moral biti izhod sistema A_client tak

################### Spodnje sporočilo je prejeto od strežnika ##################
| --------------------------------- |
Pozdravljena stranka[Naslov IP: 192.168.1.102],
** Dobrodošli na strežniku **
-Server
| --------------------------------- |

7. korak: Zdaj pojdite na strežnik B_server in poiščite spodnji izhod

Datoteka je bila uspešno kopirana
Strežnik je prekinil povezavo

8. korak: V mapi strežnika mora biti eno ime datoteke recv.txt. Vsebina tega zapisa recv.txt mora biti enaka vzorcu.txt.

Tako smo skozi program python uspešno kopirali datoteko iz odjemalca na strežnik po omrežju.

Razlage kode:

Obstajata dve datoteki python server.py in client.py .

Upoštevajte, da bomo enkrat razložili, ali je katera ista v server.py in client.py.

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

To je shebang vrstica, kar pomeni, da mora privzeto ta server.py uporabljati python3. Poglejmo eno prednost te vrstice.

Izvedli smo server.py ali client.py podobno python3. Zdaj lahko brez uporabe python3 izvedemo datoteko python. Sledite spodnjim ukazom

Pojdite v super uporabniški način:

svoje

Dajte vsa dovoljenja datoteki .py:

chmod777strežnika.py

Zaženite server.py:

./ strežnik.py uvoz vtičnica
Uvozvtičnicaknjižnico v program pythonkotmi gremo
uporabitivtičnica zapovezave.

s = vtičnica.vtičnica()

Ustvarjamo predmet s za dostop do vseh načinov vtičnice. To je koncept OOP.

PORT= 9898

Zdaj izberemo eno vrata, kjer bo poslušal strežnik. Namesto tega lahko uporabimo vrata, ki niso rezervirana.

s.vezati(('',PORT))

Za vezavo ip naslova strežnika na ta vrata uporabljamo metodo vezave [9898]. Eno opažanje je, da bi lahko namesto prvega argumenta metode vezave uporabili natančen naslov IP strežnika, vendar se odločimo, da pustimo prazno, saj to dobro deluje.

s.vezati((IP naslov,PORT))
mapa = odprto('recv.txt', 'wb')

V načinu strežnika smo odprli eno ime datoteke recv.txt in dobili kazalec na datoteko. To je potrebno, saj moramo kopirati eno besedilno datoteko iz odjemalca.

medtem Prav:

Začnimo eno neskončno zanko while, saj je naloga strežnika počakati, da odjemalec komunicira s strežnikom na vratih 9898. Ta zanka while je torej potrebna.

povez,adr=s.sprejeti()

Ta koda sprejme vse dohodne zahteve odjemalca za povezavo. Conn bo uporabil povez komunicirati s stranko in adr je naslov IP odjemalca, ki je na ta strežnik na vratih 9898 poslal zahtevo za nemire.

Sporočilo= ' n n| --------------------------------- | nPozdravljeni odjemalec [naslov IP:
'
+ dodatek[0]+'], n** Dobrodošli na strežniku ** n-Server n
| --------------------------------- | n n n'

Ta koda je namenjena ustvarjanju sporočila, ki ga pošlje odjemalcu. To sporočilo je treba natisniti na odjemalcu odjemalca. To potrjuje, da odjemalec lahko komunicira s strežnikom.

povez.pošlji(Sporočilokodirati())

Zdaj imamo sporočilo pripravljeno in ga nato pošljemo odjemalcu povez. Ta koda dejansko pošlje sporočilo odjemalcu.

RecvData=povez.pov(1024)

Ta koda sprejema vse podatke, ki so poslani s strani odjemalca. V našem primeru pričakujemo vsebino vzorca.txt v RecvData .

medtemRecvData:

Še ena zanka while s pogojem RecvData ni prazna. V našem primeru ni prazno.

mapa.pisati(RecvData)

Ko imamo vsebino v sebi RecvData potem pišemo v to datoteko recv.txt z uporabo kazalca datoteke mapa.

RecvData=povez.pov(1024)

Še enkrat poskušam prejeti, če obstajajo podatki od odjemalca. Enkrat RecvData nima podatkov, bo koda prekinila zanko while.

mapa.blizu()

S tem bomo samo zaprli kazalec na datoteko, kot smo končali s pisanjem datotek.

povez.blizu()

S tem se prekine povezava s odjemalcem.

prekiniti

To naj bi prišlo iz neskončne zanke while na strežniku B_server.

  1. client.py:
uvoz sys

Uvoz sys knjižnice, kot želimo, uporabite argument argument v pythonu.

če (len(sys.argv) > 1):
ServerIp= sys.argv[1]
drugače:
tiskanje(' n nTeči kot npython3 client.py n n')
izhod(1)

Ko med izvajanjem posredujemo naslov IP strežnika B_server po imenu datoteke client.py, moramo ta naslov IP strežnika ujeti znotraj odjemalca.

… ..If (len (sys.argv)> 1): => Za zagotovitev, da uporabnik posreduje vsaj en argument kot naslov IP in ujame ta naslov IP IP strežnika.

Če uporabnik ne posreduje vsaj ene kode argumenta, se prikaže pomoč in pride iz kode.

PORT= 9898

To morajo biti ista vrata, kot je omenjeno na strani B_server.

s.povežite((ServerIp,PORT))

Ta koda bo vzpostavila povezavo TCP z IP strežnika s temi vrati. Vse, kar je narobe na tem mestu, vodi v napake v povezavi.

mapa = odprto('sample.txt', 'rb')

Odpiramo vzorec.txt v načinu za branje samo za branje vsebine.

Pošlji podatke= mapa.prebrati(1024)

Branje vsebine datoteke in vstavljanje Pošlji podatke spremenljivka.

medtemPošlji Podatke:

Začenjamo eno zanko while, če Pošlji podatke ima podatke. V našem primeru, če vzorec.txt ni prazen, mora imeti podatke.

s.pošlji(Pošlji podatke)

Zdaj lahko pošljemo vsebino sample.txt na strežnik z uporabo objekta vtičnice s.

Pošlji podatke= mapa.prebrati(1024)

Še enkrat branje, če je še kaj ostalo. Torej iz datoteke ne bo ničesar za brati Pošlji podatke bo prazen in bo prišel iz zanke while.

s.blizu()

To ne zapre povezave s strani odjemalca.

Posnetki zaslona Ubuntu na strani strežnika

Ubuntu posnetki zaslona Odjemalska stran

Preizkušene kombinacije:

  • Linux kot strežnik in Linux kot odjemalec: PASS
  • Linux kot odjemalec in Linux kot strežnik: PASS
  • Linux kot strežnik in Windows10 kot odjemalec: PASS
  • Linux kot odjemalec in Windows10 kot strežnik: PASS

Priporočilo je, da uporabite dva sistema Linux za strežnik in odjemalca.

Pričakovane napake:

  1. Spodaj lahko vidite napako, če strežnik ne deluje na vratih 9898

Sledenje (zadnji klic zadnji):

mapa'client.py',vrstica22, v <modul>
s.povežite((ServerIp,PORT))
ConnectionRefusedError:[Errno111]Povezava zavrnjena
  1. Spodaj je prikazana napaka, če naslov IP ni poslan na strani odjemalca

Teči kot

odjemalec python3.py <strežniški naslov>
  1. Spodaj je prikazana napaka, če je 1stargument na strani odjemalca ni naslov IP

Sledenje (zadnji klic zadnji):

mapa'client.py',vrstica22, v <modul>
s.povežite((ServerIp,PORT))
vtičnica.gaierror:[Errno -2]Imealistoritevneznano
  1. Spodaj je prikazana napaka, če se vrata uporabljajo kot 98980

Sledenje (zadnji klic zadnji):

mapa'client.py',vrstica22, v <modul>
s.povežite((ServerIp,PORT))
OverflowError: getsockaddrarg: vrata morajo biti0-65535.
  1. Spodaj je prikazana napaka, če sample.txt ni na strani odjemalca.

Sledenje (zadnji klic zadnji):

mapa'client.py',vrstica25, v <modul>
mapa = odprto('sample.txt', 'rb')
FileNotFoundError:[Errno2]Ne takegamapa aliimenik:'sample.txt'

Zaključek:

S tem programom lahko pošljemo preprosto besedilno datoteko iz enega sistema v drug sistem prek omrežja s programom python. To nam omogoča osnovno učenje programiranja pythona in vtičnic tudi za pošiljanje podatkov po omrežju.