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:
- Turėtume turėti dvi „Linux“ sistemas su prieiga prie terminalo.
- Pageidautinas „Linux“ skonis „Ubuntu“.
- Reikėtų įdiegti „Python3“.
- Abi „Linux“ sistemos turėtų galėti pinguoti viena kitą. Naudokite ping
komanda patikrinti ping. - Viena sistema turėtų veikti kaip serveris, o kita sistema turėtų veikti kaip klientas tam tikru metu.
Apribojimai:
Prieš tęsdami toliau, turėtume žinoti, kad yra keletas šios programos apribojimų.
- Norint paleisti šią programą, reikia įdiegti „Python3 +“. Galite pastebėti klaidą ar kitokį elgesį, jei jis vykdomas senesnėse python versijose.
- Šiuo metu per šią programą galima perkelti tik tekstinį failą. Bet kurio kito formato failo, kuriame nėra teksto, gali nepavykti.
- Programoje buvo tvarkomos pagrindinės programavimo išimtys.
- Programa gali būti paleista kitoje OS nei „Ubuntu“.
- Teksto failas kliento pusėje turėtų būti trumpas, nes buvo naudojamas 1024 baitų buferio dydis.
Nustatykite reikalavimus:
- Mums reikia bent vienos „Linux“ sistemos, kad galėtume išbandyti šią programą. Tačiau rekomenduojama naudoti dvi skirtingas „Linux“ sistemas, kurios yra sujungtos per tinklą.
- Dvi sistemos turėtų būti sujungtos per Ethernet arba „Wi-Fi“ ar bet kokias kitas jungtis.
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.pyNeturėtų būti jokių klaidų, ir jūs turėtumėte pamatyti žemiau esančius spaudinius
Serverio sąrašas yra uoste: 9898Nukopijuotas 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.pyPastebė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 nukopijuotasServeris 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.
- serverio.py:
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ą:
suDuokite visą leidimą .py failas:
„chmod 777“ serveris.pyPaleisti serverį.py:
./ serveris.py importo lizdasSocket 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 = 9898Dabar 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.
pertraukaTai turi išeiti iš begalinio, o ciklo prie B_serverio.
- klientas.py:
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 = 9898Tai 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:
- Žemiau galite pamatyti klaidą, jei serveris neveikia 9898 prievade
„Traceback“ (paskutinis paskutinis skambutis):
Failas "klientas.py ", 22 eilutė, ins.prisijungti ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Prisijungti atsisakyta
- Žemiau klaida matoma, jei IP adresas neperduodamas kliento pusėje
Bėk kaip
python3 klientas.py < serverip address >- Žemiau klaida matoma, jei 1šv argumentas kliento pusėje nėra IP adresas
„Traceback“ (paskutinis paskutinis skambutis):
Failas "klientas.py ", 22 eilutė, ins.prisijungti ((ServerIp, PORT))
lizdas.gaierror: [Errno -2] Pavadinimas ar tarnyba nežinomi
- Žemiau pateikiama klaida, jei uostas naudojamas kaip 98980
„Traceback“ (paskutinis paskutinis skambutis):
Failas "klientas.py ", 22 eilutė, ins.prisijungti ((ServerIp, PORT))
„OverflowError“: „getockaddrarg“: prievadas turi būti 0-65535.
- Žemiau klaida matoma, jei „pavyzdys.txt “nėra kliento pusėje.
„Traceback“ (paskutinis paskutinis skambutis):
Failas "klientas.py ", 25 eilutė, infailas = 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ą.