„Python Socket“ failų perkėlimo siuntimas

Python Socket File Transfer Send



Šio straipsnio tikslas yra išmokti kaip perkelti teksto failą per tinklą per python programą . Šis failų perkėlimas pagrįstas serverio kliento modeliu, kad būtų galima naudoti lizdo programavimą „python3+“.

Č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.py

Klaidų neturėtų būti, o spaudinius turėtumėte pamatyti žemiau

Serveris pateikiamas prievade: 9898

Nukopijuotas 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 nukopijuotas
Serveris 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.

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

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ą:

jos

Suteikite visus leidimus .py failui:

chmod777serveris.py

Paleiskite server.py:

./ serveris.py importas lizdas
Importavimaslizdasbiblioteką į python programąkaipmes einame
naudotilizdas dėljungtis.

s = lizdas.lizdas()

Mes kuriame objektą s pasiekti visus lizdo metodus. Tai OOP koncepcija.

Uostas= 9898

Dabar 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.

pertrauka

Tai turi išeiti iš begalinio ciklo B_server.

  1. client.py:
importas sys

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= 9898

Tai 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:

  1. Ž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
  1. Toliau pateikiama klaida, jei IP adresas nėra perduodamas kliento pusėje

Bėk kaip

python3 klientas.py <serverio adresą>
  1. Ž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
  1. Ž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.
  1. 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.