Kas yra „Socket“ programavimas „Python“ ir kaip jį įsisavinti?

Sužinokite, kas yra „Socket“ programavimas „Python“, kartu su kliento ir serverio ryšiais, taip pat perkeliant „python“ objektus naudojant „pickle and sockets“.

Internetas neginčijamai tapo „egzistencijos siela“, o jo veiklai būdingi „ryšiai“ arba „tinklai“. Šie tinklai yra įmanomi naudojant vieną iš svarbiausių Lizdai. Šis straipsnis apima visas sritis, susijusias su „Socket“ programavimu „Python“. Lizdai padeda jums užmegzti šiuos ryšius , be abejo, palengvina.

Trumpai apžvelkime visas šiame straipsnyje aptariamas temas:



Kodėl verta naudoti „Sockets“?
Kas yra „Python“ lizdai?
Kaip pasiekti „Socket“ programavimą „Python“
Kas yra serveris?
Kas yra klientas?
„Echo Client-Server“
Keli ryšiai
„Python“ objektų perkėlimas

Kodėl verta naudoti „Sockets“?

Lizdai yra tinklų pagrindas. Jie leidžia perduoti informaciją tarp dviejų skirtingų programų ar įrenginių. Pvz., Kai atidarote savo naršyklę, jūs, kaip klientas, kuriate ryšį su serveriu informacijos perdavimui.

Prieš gilindamiesi į šį bendravimą, pirmiausia išsiaiškinkime, kokie tiksliai yra šie lizdai.

Kas yra lizdai?

Apskritai, lizdai yra vidaus galiniai taškai, sukurti duomenims siųsti ir priimti. Viename tinkle bus du lizdai, po vieną kiekvienam ryšių palaikančiam įrenginiui ar programai. Šie lizdai yra IP adreso ir prievado derinys. Viename įrenginyje gali būti „n“ lizdų skaičius, atsižvelgiant į naudojamo prievado numerį. Skirtingų tipų protokolams yra skirtingi prievadai. Norėdami sužinoti daugiau apie kai kuriuos įprastus prievado numerius ir susijusius protokolus, pažiūrėkite į šį vaizdą:


„common ports-SocketProgramminginPython-Edureka“

Dabar, kai aiškiai suprantate lizdų sąvoką, pažvelkime į „Python“ modulį „Socket“:

Kaip pasiekti „Socket“ programavimą „Python“:

Norėdami pasiekti „Socket“ programavimą „Python“, turėsite importuoti lizdas modulis arba . Šis modulis susideda iš integruotų metodų, reikalingų kuriant lizdus ir padedant jiems susieti vienas su kitu.

Kai kurie svarbūs metodai yra šie:

Metodaiapibūdinimas

lizdas. lizdas ()

naudojami kuriant lizdus (reikalingi tiek serveryje, tiek kliento galuose, norint sukurti lizdus)

socket.accept ()

naudojamas priimti ryšį. Tai pateikia porą reikšmių (jungtis, adresas), kur junginys yra naujas lizdo objektas duomenims siųsti ar priimti, o adresas yra kitame ryšio gale esančio lizdo adresas.

socket.bind ()

naudojamas susieti su adresu, kuris nurodomas kaip parametras

socket.close ()

naudojamas pažymėti lizdą kaip uždarytą

socket.connect ()

naudojamas prisijungiant prie nuotolinio adreso, nurodyto kaip parametras

lizdas. klausyk ()

įgalina serverį priimti ryšius

Dabar, kai supratote lizdo modulio svarbą, pažiūrėkime, kaip jis gali padėti sukurti serverius ir klientus „Socket“ programavimui .

Kas yra serveris?

Serveris yra programa, kompiuteris arba įrenginys, skirtas tinklo ištekliams valdyti. Serveriai gali būti tame pačiame įrenginyje arba kompiuteryje arba lokaliai prijungti prie kitų įrenginių ir kompiuterių arba net nuotoliniai. Yra įvairių tipų serveriai, tokie kaip duomenų bazių serveriai, tinklo serveriai, spausdinimo serveriai ir kt.

Serveriai dažniausiai naudoja tokius metodus kaip socket.socket (), socket.bind (), socket.listen () ir kt., Kad užmegztų ryšį ir susietų su klientais. Dabar parašykime serverio sukūrimo programą. Apsvarstykite šį pavyzdį:

PAVYZDYS:

importo lizdas s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) #porto numeris gali būti bet koks tarp 0-65535 (mes paprastai nurodome ne prevencinius uostus, kurie yra > 1023) s.klausykite (5), o tiesa: clt, adr = s.accept () print (f'Connection to {adr} įsteigta ') #f eilutė yra pažodinė eilutė, pridedama f, kurioje # yra python išraiškos petnešose clt .send (baitai („Socket programavimas„ Python ““, „utf-8“)) # siųsti informaciją kliento kišenei

Kaip matote, pirmiausia reikia sukurti lizdą - importuoti lizdo modulį. Po to socket.socket () metodas naudojamas sukurti serverio pusės lizdą.

PASTABA:

AF_INET nurodo adresą iš interneto ir jam reikia poros (pagrindinio kompiuterio, prievado), kur pagrindinis kompiuteris gali būti tam tikros svetainės URL arba jo adresas, o prievado numeris yra sveikas skaičius. SOCK_STREAM naudojama TCP protokolams kurti.

Metodas „bind ()“ priima du parametrus kaip paketą (pagrindinį kompiuterį, prievadą). Tačiau geriau naudoti 4 skaitmenų prievado numerius, nes paprastai užimami apatiniai. Klausymo () metodas leidžia serveriui priimti ryšius. Čia 5 yra kelių jungčių, atsirandančių vienu metu, eilė. Minimali vertė, kurią galima nurodyti čia, yra 0 (jei nurodysite mažesnę vertę, ji bus pakeista į 0). Jei nenurodomas joks parametras, reikia numatytojo tinkamo parametro.

The leidžia priimti ryšius visiems laikams. „Clt“ ir „adr“ yra kliento objektas ir adresas. Spausdinimo ataskaitoje tiesiog atspausdinamas kliento lizdo adresas ir prievado numeris. Galiausiai, clt.send naudojamas duomenims siųsti baitais.

Dabar, kai mūsų serveris jau nustatytas, pereikime link kliento.

Kas yra klientas?

Klientas yra kompiuteris arba programinė įranga, kuri gauna informaciją ar paslaugas iš serverio. Kliento-serverio modulyje klientai prašo paslaugų iš serverių. Geriausias pavyzdys yra interneto naršyklė, pvz., „Google Chrome“, „Firefox“ ir kt. Šios žiniatinklio naršyklės reikalauja žiniatinklio serverių reikalingiems tinklalapiams ir paslaugoms, kaip nurodo vartotojas. Kiti pavyzdžiai: internetiniai žaidimai, internetiniai pokalbiai ir kt.

Dabar pažvelkime, kaip užkoduoti kliento programos programą :

PAVYZDYS:

importuoti lizdą s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) msg ​​= s.recv (1024) print (msg.decode ('utf-8') )

Pirmasis žingsnis yra importuoti lizdo modulį ir tada sukurti lizdą, kaip jūs darėte kurdami serverį. Tada norėdami sukurti ryšį tarp kliento ir serverio, turėsite naudoti metodą connect () nurodydami (pagrindinė, prievadas).


PASTABA: gethostname naudojamas, kai klientas ir serveris yra tame pačiame kompiuteryje. (LAN - vietinis / WAN - viešasis)

saugojimo klasė c ++

Čia klientas nori gauti šiek tiek informacijos iš serverio ir tam jums reikia naudoti metodą recv (), o informacija yra saugoma kitame kintamajame msg. Tiesiog nepamirškite, kad perduodama informacija bus pateikiama baitais, o klientas, dalyvaujantis aukščiau pateiktoje programoje, vienu perdavimu gali gauti iki 1024 baitų (buferio dydžio). Jį galima nurodyti bet kokia suma, atsižvelgiant į perduodamos informacijos kiekį.

Galiausiai, perduodamas pranešimas turėtų būti iššifruotas ir atspausdintas.

Dabar, kai žinote, kaip sukurti kliento-serverio programas, pažiūrėkime, kaip jas reikia vykdyti.

„Echo“ klientas-serveris:

Norėdami vykdyti šias programas, atidarykite komandų eilutę, patekite į aplanką, kuriame sukūrėte savo kliento ir serverio programą, tada įveskite:

py server.py (čia server.py yra serverio failo pavadinimas, taip pat galite naudoti py -3.7 server.py)

Tai padarius, serveris pradeda veikti. Norėdami vykdyti klientą, atidarykite kitą cmd langą ir įveskite:

py klient.py (čia klientas.py yra kliento failo vardas)

IŠĖJIMAS (SERVERIS):

(KLIENTAS)

Pabandykime tą pačią programą, sumažindami buferio dydį iki 7 ir pažiūrėkime, kokį rezultatą gauname:

IŠĖJIMAS:

Kaip matote, ryšys nutraukiamas perkėlus 7 baitus. Bet tai yra problema, nes negavote visos informacijos ir ryšys uždarytas. Toliau spręskime šį klausimą.

Keli ryšiai:

Norėdami prisijungti tol, kol klientas gaus visą informaciją, galite naudoti „while“ kilpą:

PAVYZDYS:

importuoti lizdą s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) o True: msg = s.recv (7) print (msg.decode ('utf- 8 '))

Kai tai padarysite, visas pranešimas bus gautas 7 baitais už pervedimą.

Tačiau šį kartą, kaip matote, ryšys nenutrūksta ir niekada nežinote, kada tai įvyks. Be to, kas bus, jei iš tikrųjų nežinote, kokio dydžio yra pranešimas ar informacija, kurią klientas gaus iš serverio. Tokiais atvejais iš tikrųjų kliento pusėje galite naudoti šį bitų kodą:

PAVYZDYS:

complete_info = ', o tiesa: msg = s.recv (7), jei len (msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

Serverio pusėje naudokite uždarymo () metodą taip:

clt.close ()

Tai bus tokia, kokia parodyta paveikslėlyje žemiau:

IŠĖJIMAS:



Viskas, kas nurodyta aukščiau, yra tai, kad patikrinkite informacijos dydį ir atsispausdinkite į dviejų baitų buferį vienu metu, taip pat uždarykite ryšį, kai jis bus baigtas.

„Python“ objektų perkėlimas:

Iki šiol ką tik įgavote stygų perkėlimo įgūdį. Bet, „Socket“ programavimas „Python“ taip pat leidžia perkelti ir „Python“ objektus. Šie objektai gali būti bet kokie rinkiniai, rinkiniai, žodynai ir kt. Norėdami tai pasiekti, turėsite importuoti „Python“ marinatų modulį.

kas yra init python'e

„Python“ marinatų modulis:

„Python“ marinatų modulis patenka į paveikslėlį, kai jūs iš tikrųjų nuosekliai suremontuojate arba išjungiate serijos objektus. Pažvelkime į mažą pavyzdį,

PAVYZDYS:

importuoti marinuotų agurkų sąrašą = [1,2, 'abc'] mymsg = marinuoti agurkai (mylist) spausdinti (mymsg)

IŠĖJIMAS: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. “

Kaip matote, aukščiau pateiktoje programoje „mylist“ yra nuoseklus, naudojant marinato modulio funkciją dumps (). Taip pat atkreipkite dėmesį, kad išvestis prasideda „b“, tai reiškia, kad ji konvertuojama į baitus. Lizdų programavime galite įdiegti šį modulį, kad galėtumėte perkelti pitono objektai tarp klientų ir serverių.

Kaip naudoti sūrymo modulį perkeliant python objektų struktūras?

Kai naudojate marinuotą agurką kartu su lizdais, galite bet ką perduoti per tinklą. Parašykime serverio ir kliento pusės atitikmenis, kad perkeltume sąrašą iš serverio į klientą:

Serverio pusė:

importo lizdas importo marinatas a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 2133)) #binding tuple s.listen (5) while True: clt, adr = s.accept () print (f'Prisijungimas prie {adr} sukurtas ') m = {1:' Client ', 2:' Server '} mymsg = pickle.dumps (m) # msg mes norime atspausdinti vėliau mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

Čia m yra žodynas, kuris iš esmės yra a kurį reikia išsiųsti iš serverio klientui. Tai daroma iš pradžių serializuojant objektą naudojant sąvartynus () ir tada paverčiant jį baitais.
Dabar užrašykime kliento pusės atitikmenį:

Kliento pusė:

importuoti lizdą importuoti marinuotą agurką a = 10 s = lizdas. lizdas (lizdas.AF_INET, lizdas.SOCK_STREAM) = s.recv (10), jei rec_msg: print (f 'Pranešimo ilgis = {mymsg [: a]}') x = int (mymsg [: a]) rec_msg = Klaidingas complete_info + = mymsg, jei len (complete_info) -a == x: spausdinti ('Gauta visa informacija') spausdinti (complete_info [a:]) m = marinatas.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b '' print (complete_info )

Pirmoji ciklo ciklas padės mums sekti visą pranešimą (complete_info), taip pat gautą pranešimą (rec_msg) naudojant buferį. pranešimą nustatydami rec_
Tada, kol gaunamas pranešimas, viskas, ką darau, yra atspausdinti kiekvieną jo dalį, gaunamą 10 dydžio buferyje. Šis dydis gali būti bet koks, priklausomai nuo jūsų asmeninio pasirinkimo.

Tada, jei gautas pranešimas yra lygus visam pranešimui, aš tiesiog spausdinu pranešimą kaip gautą visą informaciją, po kurios aš ištryniau pranešimą naudodamas „load“ ().

Pirmiau minėtos programos rezultatas yra toks:

Tai atvedė mus į „Python“ „Socket Programming“ straipsnio pabaigą. Tikiuosi, kad visas sąvokas supratote aiškiai.

Įsitikinkite, kad praktikuojate kuo daugiau ir grąžinkite savo patirtį.

Turite mums klausimą? Prašau tai paminėti šio tinklaraščio „Socket Programming in Python“ komentarų skyriuje ir mes kuo greičiau susisieksime su jumis.

Norėdami gauti išsamių žinių apie „Python“ kartu su įvairiomis jo programomis, galite užsiregistruoti tiesiogiai su parą visą parą ir visą gyvenimą.