„Python“

„Python Socket“ failų siuntimas

„Python Socket“ failų siuntimas
Šio straipsnio tikslas yra išmokti kaip perkelti teksto failą per tinklą per python programą. Šis failų perdavimas yra pagrįstas serverio kliento modeliu, kad būtų galima naudoti „Python3“ programavimą+.

Pagrindinė sąrankos schema:

Čia pateikiama pagrindinė šios programos vykdymo schema.

Paprastumo dėlei visame straipsnyje sistemą A vadinsime A_client, o B sistemą - B_server.

Reikalavimai failui:

Mums reikia serverio.py ir šis failas turėtų būti serverio sistemoje. Mūsų atveju serveris.py turėtų būti B_serverio sistemoje.

Dar dvi bylos klientas.py ir pavyzdys.txt turėtų būti kliento sistemoje. Mūsų atveju šie du failai turėtų būti A_client sistemoje.

Prielaidos:

Štai prielaidos:

Apribojimai:

Prieš tęsdami toliau, turėtume žinoti, kad yra keletas šios programos apribojimų.

Nustatykite reikalavimus:

Serverio šaltinio kodas:

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

Kliento šaltinio kodas:

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

Kaip paleisti programas ir laukiamą rezultatą:

Čia pateikiami programos vykdymo veiksmai.

1 žingsnis: Eikite į „B_server“ sistemą ir atidarykite terminalą. Trumpasis kelias norint atidaryti terminalą yra „Alt“ + „Ctrl“ + t.

2 žingsnis: Dabar eikite keliu, kur serveris.py yra.

3 žingsnis: Dabar paleiskite serverį.py kaip žemiau

python3 serveris.py

Neturėtų būti jokių klaidų, ir jūs turėtumėte pamatyti žemiau esančius spaudinius

Serverio sąrašas yra uoste: 9898

Nukopijuotas failo pavadinimas bus rekv.txt serverio pusėje

4 žingsnis: Dabar atidarykite terminalą „A_client“ sistemoje.

5 žingsnis: Eikite į kelią, kur klientas.py ir mėginys.yra txt.

6 žingsnis: Dabar paleiskite klientą.py kaip žemiau

python3 klientas.py

Pastebėjome, kad turime žinoti serverio IP adresą. Mes galime vykdyti žemiau esančią komandą, norėdami sužinoti B_server sistemos IP adresą.

ifconfig

Dabar A_client sistemos išvestis turėtų būti tokia

################## Žemiau pateiktas pranešimas gaunamas iš serverio ###################
| -------------------------------- | |
Sveikas klientas [IP adresas: 192.168.1.102],
** Sveiki atvykę į serverį **
-Serveris
| -------------------------------- | |

7 žingsnis: Dabar eikite į B_server ir ieškokite žemiau išvesties

Failas sėkmingai nukopijuotas
Serveris uždarė ryšį

8 veiksmas: turėtų būti vienas failo pavadinimas recv.txt serverio aplanke. Šios recv.txt turėtų būti tas pats pavyzdys.txt.

Taigi mes sėkmingai nukopijavome failą iš kliento į serverį per tinklą per python programą.

Kodo paaiškinimai:

Yra du python failai serverio.py ir klientas.py.

Atkreipkite dėmesį, kad mes vieną kartą paaiškinsime, ar serveryje yra tas pats kodas.py ir klientas.py.

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

Tai yra „shebang“ linija, kuri pagal nutylėjimą reiškia šį serverį.py turėtų naudoti python3. Pažiūrėkime vieną šios linijos pranašumą.

Mes įvykdėme serverį.py ar klientas.py patinka pitonas3 <.py file name>. Dabar nenaudodami python3 galime paleisti python failą. Vykdykite toliau pateiktas komandas

Eikite į super vartotojo režimą:

su

Duokite visą leidimą .py failas:

„chmod 777“ serveris.py

Paleisti serverį.py:

./ serveris.py importo lizdas
Socket bibliotekos importavimas į python programą, kaip mes einame
naudoti prijungimo lizdą.
s = lizdas.lizdas()

Mes kuriame objektą „S“ prieiti prie visų lizdo būdų. Tai yra OOP koncepcija.

Uostas = 9898

Dabar mes pasirenkame vieną prievadą, kuriame serveris klausysis. Vietoj to galime naudoti ne rezervuotą uostą.

s.įrišti ((", PORT))

Norėdami susieti serverio IP adresą su tuo prievadu, naudojame susiejimo metodą [9898]. Vienas pastebėjimas yra tai, kad mes galėjome naudoti tikslų serverio IP adresą vietoje pirmo susiejimo metodo argumento, tačiau mes nusprendėme palikti tuščią, nes šis darbas gerai.

s.susieti ((IP adresas, Uostas))
failas = atidaryti ("rekv.txt "," wb ")

Mes atidarėme vieną failo pavadinimą „recv.txt “serveryje rašymo režimui ir gavo failo žymeklį. Tai reikalinga, nes turime nukopijuoti vieną tekstinį failą iš kliento.

o tiesa:

Pradėkime vieną begalinį ciklą, nes serverio darbas yra laukti, kol klientas susisieks su serveriu tame 9898 prievade. Taigi, kol reikalinga kilpa.

jungtis, addr = s.priimti()

Šis kodas turi priimti bet kokią kliento gaunamą prisijungimo užklausą. „Conn“ naudos „jungtis “ bendrauti su klientu ir „Addr“ yra kliento, kuris siuntė šurmulio užklausą šiam serveriui 9898 prievade, IP adresas.

msg = "\ n \ n | --------------------------------- | \ n Sveikas klientas [IP adresas:
"+ addr [0] +"], \ n ** Sveiki atvykę į serverį ** \ n -Serveris \ n
| --------------------------------- | \ n \ n \ n "

Šis kodas skirtas sukurti pranešimą, kurį reikia nusiųsti klientui. Šis pranešimas turėtų būti atspausdintas kliento terminale. Tai patvirtina, kad klientas gali bendrauti su serveriu.

jung.siųsti (praneš.koduoti ())

Dabar mes turime pranešimą paruoštą ir nusiųskite jį klientui naudodamiesi tuo „Jungtis“. Šis kodas iš tikrųjų siunčia pranešimą klientui.

RecvData = jungtis.recv (1024)

Šis kodas gauna visus duomenis, siunčiamus iš kliento pusės. Mūsų atveju mes tikimės pavyzdžio turinio.txt „RecvData“.

o „RecvData“:

Dar viena, kol ciklas su sąlyga „RecvData“ nėra tuščias. Mūsų atveju jis nėra tuščias.

failą.rašyti („RecvData“)

Kai turėsime turinio viduje „RecvData“ tada mes rašome į tą bylą „Rekv.txt “ naudojant failo žymeklį „Failas“.

RecvData = jungtis.recv (1024)

Vėl bandau gauti, jei yra kokių nors duomenų iš kliento. Kartą „RecvData“ neturi duomenų, kodas pertrauks „while“ kilpą.

failą.Uždaryti()

Tai tiesiog uždarys failo žymeklį, kai baigsime rašyti failą.

jung.Uždaryti()

Tai uždarys ryšį su klientu.

pertrauka

Tai turi išeiti iš begalinio, o ciklo prie B_serverio.

  1. klientas.py:
importuoti sistemas

Importuojant „sys“ biblioteką, kaip norime, naudokite „Python“ argumentų galimybę.

jei (len (sys.argv)> 1):
ServerIp = sys.argv [1]
Kitas:
print ("\ n \ n Vykdyti kaip \ n python3 klientą.py < serverip address > \ n \ n ")
išėjimas (1)

Kai mes perduodame B_server IP adresą po failo vardo kliento.Paleidžiant, mes turime sugauti tą serverio IP adresą kliento viduje.

... jei (len (sys.argv)> 1): => Norėdami įsitikinti, kad vartotojas perduoda bent vieną argumentą kaip IP adresą ir sugauti tą IP adresą „ServerIP“.

Jei vartotojas neišlaikys bent vieno argumento kodo, jis parodys pagalbą ir išeis iš kodo.

Uostas = 9898

Tai turi būti tas pats prievadas, kuris minimas B_serverio pusėje.

s.prisijungti ((ServerIp, PORT))

Šis kodas atliks TCP ryšį su serverio IP su tuo prievadu. Viskas, kas yra blogai šiame ponte, sukelia nesėkmes.

failas = atidaryti ("pavyzdys.txt "," rb ")

Atidarome „pavyzdį.txt “skaitymo režimu skaityti tik turinį.

SendData = failas.skaityti (1024)

Skaityti failo turinį ir įdėti į vidų “Siųsti duomenis “ kintamasis.

o „SendData“:

Mes pradedame vieną laiką, kai „Siųsti duomenis “ turi duomenų. Mūsų atveju, jei „pavyzdys.txt “nėra tuščias, jame turėtų būti duomenų.

s.siųsti („SendData“)

Dabar galime siųsti „Pavyzdys.txt “ į serverį naudojant lizdo objektą „S“.

SendData = failas.skaityti (1024)

Vėl skaitau, ar dar kas liko. Taigi nebus ko skaityti iš bylos „SendData“ bus tuščias ir išeis iš while loop.

s.Uždaryti()

Tai neuždaro ryšio iš kliento pusės.

„Ubuntu Screenshots Server“ pusė

„Ubuntu Screenshots“ kliento pusė

Išbandyti deriniai:

  • „Linux“ kaip serveris ir „Linux“ kaip klientas: PASS
  • „Linux“ kaip klientas ir „Linux“ kaip serveris: PASS
  • „Linux“ kaip serveris ir „Windows10“ kaip klientas: PASS
  • „Linux“ kaip klientas ir „Windows10“ kaip serveris: PASS

Rekomenduojama naudoti dvi „Linux“ sistemas serveriui ir klientui.

Laukiamos klaidos:

  1. Žemiau galite pamatyti klaidą, jei serveris neveikia 9898 prievade

„Traceback“ (paskutinis paskutinis skambutis):

Failas "klientas.py ", 22 eilutė, in
s.prisijungti ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Prisijungti atsisakyta
  1. Žemiau klaida matoma, jei IP adresas neperduodamas kliento pusėje

Bėk kaip

python3 klientas.py < serverip address >
  1. Žemiau klaida matoma, jei 1šv argumentas kliento pusėje nėra IP adresas

„Traceback“ (paskutinis paskutinis skambutis):

Failas "klientas.py ", 22 eilutė, in
s.prisijungti ((ServerIp, PORT))
lizdas.gaierror: [Errno -2] Pavadinimas ar tarnyba nežinomi
  1. Žemiau pateikiama klaida, jei uostas naudojamas kaip 98980

„Traceback“ (paskutinis paskutinis skambutis):

Failas "klientas.py ", 22 eilutė, in
s.prisijungti ((ServerIp, PORT))
„OverflowError“: „getockaddrarg“: prievadas turi būti 0-65535.
  1. Žemiau klaida matoma, jei „pavyzdys.txt “nėra kliento pusėje.

„Traceback“ (paskutinis paskutinis skambutis):

Failas "klientas.py ", 25 eilutė, in
failas = atidaryti ("pavyzdys.txt "," rb ")
FileNotFoundError: [2 klaida] Nėra tokio failo ar katalogo: 'sample.txt '

Išvada:

Naudodamiesi šia programa, naudodami python programą, mes galime per tinklą nusiųsti paprastą tekstinį failą iš vienos sistemos į kitą. Tai leidžia mums išmokti pagrindinio Python ir Socket programavimo, taip pat norint siųsti duomenis per tinklą.

Kaip pakeisti kairįjį ir dešinįjį pelės mygtukus „Windows 10“ kompiuteryje
Gana įprasta, kad visi kompiuterio pelės įrenginiai yra ergonomiškai sukurti dešiniarankiams. Tačiau yra pelių prietaisų, specialiai sukurtų kairiaran...
Mėgdžiokite pelės paspaudimus, užveskite pelės žymeklį naudodami pelę „Clickless Mouse“ sistemoje „Windows 10“
Pelės ar klaviatūros naudojimas netinkamoje laikysenoje, kai naudojama per daug, gali sukelti daug sveikatos problemų, įskaitant įtampą, riešo kanalo ...
Pridėkite pelės gestus prie „Windows 10“ naudodami šiuos nemokamus įrankius
Pastaraisiais metais kompiuteriai ir operacinės sistemos labai išsivystė. Buvo laikas, kai vartotojai turėjo naudoti komandas naršydami per failų tvar...