Čia yra pagrindinė šios programos paleidimo schema.
Paprastumo dėlei visame straipsnyje vadinsime sistemą A kaip „A_client“, o sistemą „B“ - „B_server“.
Failo reikalavimai:
Mums reikia server.py ir šis failas turėtų būti serverio sistemoje. Mūsų atveju server.py turėtų būti sistemoje B_server.
Dar du failai klientas.py ir sample.txt turėtų būti kliento sistemoje. Mūsų atveju šie du failai turėtų būti A_client sistemoje.
Prielaidos:
Štai tokios prielaidos:
- Turėtume turėti dvi „Linux“ sistemas su prieiga prie terminalo.
- Pageidautinas „Linux“ skonis Ubuntu .
- Turi būti įdiegta „Python3“.
- Abi „Linux“ sistemos turėtų sugebėti pinguoti viena kitą. Naudoti 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, turėtume žinoti, kad yra keletas šios programos apribojimų.
- Norint paleisti šią programą, reikia įdiegti „Python3+“. Jei naudojate senesnes „python“ versijas, galite pastebėti klaidą ar kitokį elgesį.
- Šiuo metu per šią programą galima perkelti tik tekstinį failą. Bet koks kito formato failas, kuriame nėra teksto, gali nepavykti.
- Programoje buvo išnagrinėtos pagrindinės programavimo išimtys.
- Programa gali veikti arba ne, bet ne OS, o ne „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, sujungtas per tinklą.
- Dvi sistemos turi būti prijungtos per eternetą, „Wi-Fi“ arba 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/client.py
Kaip paleisti programas ir numatomas rezultatas:
Čia pateikiami programos vykdymo veiksmai.
1 žingsnis: Eikite į „B_server“ sistemą ir atidarykite terminalą. Trumpas kelias atidaryti terminalą yra Alt+Ctrl+t.
2 žingsnis: Dabar eikite keliu, kuriame yra server.py.
3 žingsnis: Dabar paleiskite server.py, kaip parodyta žemiau
python3 serveris.pyKlaidų neturėtų būti, o spaudinius turėtumėte pamatyti žemiau
Serveris pateikiamas prievade: 9898Nukopijuotas failo pavadinimas bus recv.txt serverio pusėje
4 žingsnis: Dabar atidarykite terminalą „A_client“ sistemoje.
5 veiksmas: eikite į kelią, kuriame yra client.py ir sample.txt.
6 veiksmas: dabar paleiskite client.py, kaip nurodyta toliau
python3 klientas.py <B_server sistemos IP>Pastebėjome, kad turime žinoti serverio IP adresą. Mes galime vykdyti žemiau pateiktą komandą, kad žinotume B_server sistemos IP adresą.
ifconfig
Dabar „A_client“ sistemos išvestis turėtų būti tokia
################## Žemiau esantis pranešimas gautas iš serverio #################| -------------------------------- |
Labas Kliente[IP adresas: 192.168.1.102],
** Sveiki atvykę į serverį **
-Serveris
| -------------------------------- |
7 žingsnis: Dabar eikite į „B_server“ ir ieškokite žemiau esančios išvesties
Failas sėkmingai nukopijuotasServeris nutraukė ryšį
8 veiksmas: serverio aplanke turėtų būti vienas failo pavadinimas recv.txt. Šio recv.txt turinio turėtų būti tas pats sample.txt.
Taigi mes sėkmingai nukopijavome failą iš kliento į serverį per tinklą per python programą.
Kodo paaiškinimai:
Yra du „Python“ failai server.py ir klientas.py .
Atminkite, kad vieną kartą paaiškinsime, ar koks nors kodas yra tas pats server.py ir client.py.
- server.py:
Tai yra shebang eilutė, kuri reiškia, kad pagal nutylėjimą šis serveris.py turėtų naudoti python3. Pažvelkime į vieną šios linijos pranašumą.
Mes įvykdėme server.py arba client.py kaip python3. Dabar nenaudodami python3 galime vykdyti python failą. Vykdykite žemiau pateiktas komandas
Eikite į super vartotojo režimą:
josSuteikite visus leidimus .py failui:
chmod777serveris.pyPaleiskite server.py:
./ serveris.py importas lizdasImportavimaslizdasbiblioteką į python programąkaipmes einame
naudotilizdas dėljungtis.
s = lizdas.lizdas()
Mes kuriame objektą s pasiekti visus lizdo metodus. Tai OOP koncepcija.
Uostas= 9898Dabar mes pasirenkame vieną prievadą, kuriame serveris klausys. Vietoj to galime naudoti neužsakytą prievadą.
s.įpareigoti(('',Uostas))Mes naudojame susiejimo metodą, norėdami susieti serverio IP adresą su šiuo prievadu [9898]. Vienas pastebėjimas yra tas, kad mes galėjome naudoti tikslų serverio IP adresą vietoj pirmojo susiejimo metodo argumento, tačiau mes pasirenkame palikti tuščią, nes tai veikia gerai.
s.įpareigoti((IP adresas,Uostas))failą = atviras(„recv.txt“, 'wb')
Serveryje atidarėme vieną failo pavadinimą recv.txt rašymo režimui ir gavome failo žymeklį. Tai būtina, nes turime nukopijuoti vieną teksto failą iš kliento.
tuo tarpu Tiesa:Pradėkime nuo begalinio ciklo, nes serverio užduotis yra palaukti, kol klientas bendrauja su serveriu tame 9898 prievade. Taigi reikia šio ciklo.
sujungti,adr=s.priimti()Šis kodas skirtas priimti bet kokias įeinančias prisijungimo užklausas iš kliento. Conn naudos sujungti bendrauti su klientu ir adr yra kliento, kuris išsiuntė maišymo užklausą į šį serverį 9898 prievade, IP adresas.
msg= ' n n| -------------------------------- | nSveiki, kliente [IP adresas:'+ adresas[0]+'], n** Sveiki atvykę į serverį ** n-Serveris n
| -------------------------------- | n n n'
Šis kodas skirtas sukurti pranešimą, kurį reikia išsiųsti klientui. Šis pranešimas turėtų būti atspausdintas kliento terminale. Tai patvirtina, kad klientas gali bendrauti su serveriu.
sujungtisiųsti(msg.koduoti())Dabar mes turime paruoštą pranešimą ir tada jį išsiųsime klientui sujungti Šis kodas iš tikrųjų siunčia pranešimą klientui.
RecvData=sujungtirecv(1024)Šis kodas gauna visus duomenis, siunčiamus iš kliento pusės. Mūsų atveju laukiame „sample.txt“ turinio RecvData .
tuo tarpuRecvData:Dar vienas ciklas su sąlyga „RecvData“ nėra tuščias. Mūsų atveju jis nėra tuščias.
failą.rašyti(RecvData)Kai turim turinį viduje RecvData tada mes rašome į tą failą recv.txt naudojant failų žymeklį failą.
RecvData=sujungtirecv(1024)Vėl bandau gauti, ar yra duomenų iš kliento. Kartą RecvData neturi duomenų, kodas nutraukia ciklo ciklą.
failą.Uždaryti()Tai tiesiog uždarys failo žymeklį, kai baigsime rašyti failą.
sujungtiUždaryti()Tai nutraukia ryšį su klientu.
pertraukaTai turi išeiti iš begalinio ciklo B_server.
- client.py:
Importuodami „sys“ biblioteką, kaip norime, naudokite argumentų funkciją „python“.
jei (len(sys.argv) > 1):ServerIp= sys.argv[1]
Kitas:
spausdinti(' n nBėk kaip npython3 client.py n n')
išeiti(1)
Kai vykdydami perduodame B_server IP adresą po failo pavadinimo client.py, turime užfiksuoti tą serverio IP adresą kliento viduje.
… ..If (len (sys.argv)> 1): => Norėdami įsitikinti, kad vartotojas perduoda bent vieną argumentą kaip IP adresą ir sugauna tą IP adresą insdie Serveris IP.
Jei vartotojas nepateikia bent vieno argumento kodo, rodoma pagalba ir išeinama iš kodo.
Uostas= 9898Tai turi būti tas pats prievadas, kaip minėta B_server pusėje.
s.Prisijungti((ServerIp,Uostas))Šis kodas sudarys TCP ryšį su serverio IP su tuo prievadu. Viskas, kas negerai šiame poninte, sukelia nesėkmes.
failą = atviras(„sample.txt“, „rb“)Mes atidarome failą sample.txt skaitymo režimu, kad galėtume skaityti tik turinį.
SendData= failą.skaityti(1024)Failo turinio skaitymas ir įdėjimas į vidų SendData kintamasis.
tuo tarpuSendData:Mes pradedame vieną ciklą, jei SendData turi duomenų. Mūsų atveju, jei „sample.txt“ nėra tuščias, jame turėtų būti duomenų.
s.siųsti(SendData)Dabar galime siųsti turinį sample.txt į serverį naudojant lizdo objektą s.
SendData= failą.skaityti(1024)Dar kartą perskaitykite, jei kas nors liko. Taigi iš failo nebus ką skaityti SendData bus tuščias ir išeis iš ciklo.
s.Uždaryti()Tai neuždaro ryšio iš kliento pusės.
„Ubuntu“ ekrano kopijos serverio pusėje
„Ubuntu“ ekrano nuotraukos kliento pusėje
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 serveriui ir klientui naudoti dvi „Linux“ sistemas.
Numatomos klaidos:
- Žemiau galite pamatyti klaidą, jei serveris neveikia 9898 prievade
Atsekimas (paskutinis paskutinis skambutis):
Failas'client.py',linija22, į <modulis>s.Prisijungti((ServerIp,Uostas))
ConnectionRefusedError:[Errno111]Ryšys atmestas
- Toliau pateikiama klaida, jei IP adresas nėra perduodamas kliento pusėje
Bėk kaip
python3 klientas.py <serverio adresą>- Žemiau esanti klaida matoma, jei 1stargumentas kliento pusėje nėra IP adresas
Atsekimas (paskutinis paskutinis skambutis):
Failas'client.py',linija22, į <modulis>s.Prisijungti((ServerIp,Uostas))
lizdas.gaierror:[Klaida -2]vardasarbapaslauganežinomas
- Žemiau esanti klaida matoma, jei prievadas naudojamas kaip 98980
Atsekimas (paskutinis paskutinis skambutis):
Failas'client.py',linija22, į <modulis>s.Prisijungti((ServerIp,Uostas))
OverflowError: getsockaddrarg: uostas turi būti0-65535.
- Toliau pateikiama klaida, jei „sample.txt“ nėra kliento pusėje.
Atsekimas (paskutinis paskutinis skambutis):
Failas'client.py',linija25, į <modulis>failą = atviras(„sample.txt“, „rb“)
FileNotFoundError:[Errno2]Tokių nėrafailą arbakatalogas:„sample.txt“
Išvada:
Naudodamiesi šia programa mes galime siųsti paprastą teksto failą iš vienos sistemos į kitą sistemą per tinklą, naudodami python programą. Tai suteikia mums pagrindinio žinių apie python ir lizdo programavimą, taip pat siunčiant duomenis tinklu.