Mis on Pythonis Socket-programmeerimine ja kuidas seda hallata?



Siit saate teada, mis on Pythonis sokli programmeerimine koos kliendi-serveri suhtlusega koos pythoni objektide ülekandega, kasutades selleks hapukurgi ja pistikupesasid.

Internetist on vaieldamatult saanud “olemasolu hing” ja selle tegevust iseloomustavad ‘ühendused’ või ‘võrgud’. Need võrgud on tehtud võimalikuks, kasutades ühte kõige olulisematest põhialustest Pistikupesad. See artikkel hõlmab kõiki Pythonis Socket-programmeerimisega seotud valdkondi. Pistikupesad aitavad teil neid ühendusi luua muudab selle kahtlemata lihtsaks.

Vaatame kiiresti kõiki selles artiklis käsitletud teemasid:





Miks kasutada pistikupesasid?
Mis on Pythoni pistikupesad?
Kuidas saavutada Pythonis Socket-programmeerimine
Mis on server?
Mis on klient?
Kaja klient-server
Mitu suhtlust
Pythoni objektide ülekandmine



Miks kasutada pistikupesasid?

Pistikupesad on võrgu loomise selgroog. Need võimaldavad teabe edastamist kahe erineva programmi või seadme vahel. Näiteks kui avate oma brauseri, loote kliendina teabe edastamiseks ühenduse serveriga.

Enne kui sellesse suhtlusse süveneda, mõelgem kõigepealt välja, mis need pistikupesad täpselt on.

Mis on pistikupesad?

Üldiselt on pistikupesad siseruumide lõpp-punktid, mis on loodud andmete saatmiseks ja vastuvõtmiseks. Ühel võrgul on kaks pistikupesa, üks iga sideseadme või programmi jaoks. Need pistikupesad on IP-aadressi ja pordi kombinatsioon. Ühel seadmel võib olla „n” pesade arv, sõltuvalt kasutatava pordi numbrist. Erinevat tüüpi protokollide jaoks on saadaval erinevad pordid. Mõne levinuma pordinumbri ja sellega seotud protokollide kohta lisateabe saamiseks vaadake järgmist pilti:




levinud pordid-SocketProgramminginPython-Edureka

Nüüd, kui pistikupesade mõiste on selge, vaatame nüüd Pythoni moodulit Socket:

Kuidas saavutada Pythonis sokli programmeerimine:

Socket programmeerimise saavutamiseks Pythonis peate importima pistikupesa moodul või . See moodul koosneb sisseehitatud meetoditest, mis on vajalikud pistikupesade loomiseks ja aitavad neil üksteisega suhelda.

Mõned olulised meetodid on järgmised:

MeetodidKirjeldus

pesa.pesa ()

kasutatakse pistikupesade loomiseks (nõutakse pistikupesade loomiseks nii serveris kui ka kliendi otstes)

socket.accept ()

kasutatakse ühenduse aktsepteerimiseks. See tagastab väärtuste paari (ühendus, aadress), kus conn on uus sokliobjekt andmete saatmiseks või vastuvõtmiseks ning aadress on ühenduse teises otsas asuva sokli aadress.

socket.bind ()

kasutatakse parameetrina määratud aadressiga sidumiseks

socket.close ()

mis on pakendid javas
kasutatakse pesa suletuks märkimiseks

socket.connect ()

kasutatakse parameetrina määratud kaugaadressiga ühenduse loomiseks

socket.listen ()

võimaldab serveril ühendusi aktsepteerida

Nüüd, kui olete mõistnud pistikupesa mooduli olulisust, läheme edasi, et näha, kuidas see võib teenida serverite ja klientide loomist pistikprogrammi programmeerimiseks .

Mis on server?

Server on kas programm, arvuti või seade, mis on pühendatud võrguressursside haldamisele. Serverid võivad olla kas samas seadmes või arvutis või lokaalselt ühendatud teiste seadmete ja arvutitega või isegi kaugjuhtimisega. Servereid on erinevat tüüpi, näiteks andmebaasiserverid, võrguserverid, prindiserverid jne.

Serverid kasutavad ühenduse loomiseks ja klientidega sidumiseks tavaliselt meetodeid nagu socket.socket (), socket.bind (), socket.listen () jne. Nüüd kirjutame serveri loomiseks programmi. Vaatleme järgmist näidet:

NÄIDE:

impordipesa s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) # porti number võib olla ükskõik milline vahemikus 0-65535 (tavaliselt määrame mitte-levinud pordid, mis on > 1023) s.listen (5), kui True: clt, adr = s.accept () print (f'Ühendus domeeniga {adr} loodud ') #f string on sõna otseses mõttes string, millele on lisatud f, mis # sisaldab pütoni väljendeid traksidega clt .send (bytes ('Socket Programming in Python', 'utf-8')) # teabe saatmiseks klienditaskusse

Nagu näete, on pesa loomise esimene vajadus sokli mooduli importimine. Pärast seda kasutatakse serveripoolse sokli loomiseks meetodit socket.socket ().

MÄRGE:

AF_INET viitab Interneti-aadressile ja see nõuab paari (host, port), kus host võib olla kas mõne konkreetse veebisaidi URL või selle aadress ja pordi number on täisarv. SOCK_STREAM-i kasutatakse TCP-protokollide loomiseks.

Meetod bind () aktsepteerib kaks parameetrit dupleksina (host, port). Parem on siiski kasutada neljakohalisi pordinumbreid, kuna madalamad on tavaliselt hõivatud. Kuulamise () meetod võimaldab serveril ühendusi aktsepteerida. Siin on 5 korraga mitme ühenduse loomise järjekord. Siin saab määrata minimaalse väärtuse 0 (kui annate väiksema väärtuse, muudetakse see väärtuseks 0). Kui parameetrit pole määratud, võtab see vaikimisi sobiva.

The võimaldab igavesti ühendusi vastu võtta. „Clt” ja „adr” on kliendi objekt ja aadress. Prindiväljaanne prindib lihtsalt välja kliendi sokli aadressi ja pordi numbri. Lõpuks kasutatakse clt.send andmete edastamiseks baitides.

Nüüd, kui meie server on kõik valmis, liigume edasi kliendi poole.

java madal koopia vs sügav koopia

Mis on klient?

Klient on kas arvuti või tarkvara, mis võtab serverilt teavet või teenuseid vastu. Kliendi-serveri moodulis taotlevad kliendid serveritelt teenuseid. Parim näide on veebibrauser nagu Google Chrome, Firefox jne. Need veebibrauserid taotlevad veebiservereid vajalike veebisaitide ja teenuste jaoks vastavalt kasutaja juhistele. Muud näited hõlmavad võrgumänge, veebivestlusi jne.

Vaatame nüüd, kuidas kliendipoolset programmi kodeerida :

NÄIDE:

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

Esimene samm on sokli mooduli importimine ja seejärel sokli loomine täpselt samamoodi nagu serveri loomisel. Seejärel peate kliendi-serveri vahel ühenduse loomiseks kasutama meetodit connect (), määrates (host, port).


MÄRGE: gethostname'i kasutatakse juhul, kui klient ja server on ühes arvutis sisse lülitatud. (LAN - localip / WAN - publicip)

Siin soovib klient serverist teavet saada ja selleks peate kasutama meetodit recv () ja teave salvestatakse teise muutuja msg-sse. Pidage lihtsalt meeles, et edastatav teave on baitides ja ülaltoodud programmi klient saab ühe ülekandena vastu võtta kuni 1024 baiti (puhvri suurus). Seda saab määrata mis tahes summana, sõltuvalt edastatava teabe hulgast.

Lõpuks tuleks edastatav sõnum dekodeerida ja printida.

Nüüd, kui olete teadlik kliendi-serveri programmide loomisest, läheme edasi, et näha, kuidas need tuleb käivitada.

Kaja klient-server:

Nende programmide käivitamiseks avage käsuviip, minge kausta, kuhu olete oma kliendi ja serveriprogrammi loonud, ja tippige seejärel:

py server.py (siin, server.py on serveri failinimi, võite kasutada ka py -3,7 server.py)

Kui see on tehtud, hakkab server töötama. Kliendi käivitamiseks avage teine ​​cmd-aken ja tippige:

py klient.py (siin on klient.py kliendi failinimi)

VÄLJUND (SERVER):

(KLIENT)

Proovime sama programmi, vähendades puhvri suuruse 7-le ja vaadake, millise väljundi saame:

VÄLJUND:

klassi java eksemplar

Nagu näete, katkestatakse ühendus pärast 7 baiti ülekandmist. Kuid see on probleem, kuna te pole täielikku teavet saanud ja ühendus on suletud. Jätkame selle probleemi lahendamist.

Mitu sidet:

Ühenduse jätkumiseks, kuni klient saab täieliku teabe, võite kasutada while-tsüklit:

NÄIDE:

impordi pesa s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) samas True: msg = s.recv (7) print (msg.decode ('utf- 8 '))

Kui olete seda teinud, saadetakse kogu sõnum 7 baidina ülekande kohta.

Kuid seekord, nagu näete, ei katkestata ühendust ja kunagi ei tea, millal see juhtub. Ja kui veel lisada, siis mis saab siis, kui te tegelikult ei tea, kui suur on sõnum või teave, mille klient serverilt saab. Sellistel juhtudel saate tegelikult kasutada järgmist koodibitti kliendi poolel:

NÄIDE:

complete_info = '' samas tõene: msg = s.recv (7) kui len (msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

Serveri poolel kasutage meetodit close () järgmiselt:

clt.close ()

Selle väljund on selline, nagu on näidatud alloleval pildil:

VÄLJUND:



Kõik ülaltoodud koodiplokk on see, et kontrollitakse teabe suurust ja printitakse korraga kahes baidisesse puhvrisse ning suletakse ühendus pärast selle lõpetamist.

Pythoni objektide ülekandmine:

Siiani on teil just keelte ülekandmise oskus olemas. Kuid pistikupesa programmeerimine Python võimaldab teil edastada ka Pythoni objekte. Need objektid võivad olla näiteks komplektid, tuplid, sõnaraamatud jne. Selle saavutamiseks peate importima Pythoni hapukurkmooduli.

Pythoni hapukurkmoodul:

Pythoni hapukurkmoodul ilmub pildile siis, kui tegelete objektide Pythonis reaaliseerimisega või seeriate eemaldamisega. Vaatame väikest näidet,

NÄIDE:

impordi hapukurkide loend = [1,2, 'abc'] mymsg = marineeritud kurgid (mylist) print (mymsg)

VÄLJUND: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ”

Nagu näete, on ülaltoodud programmis järjestatud ‘mylist’, kasutades hapukurgimooduli funktsiooni dumps (). Pange tähele ka seda, et väljund algab tähega b, mis tähendab, et see teisendatakse baitideks. Pistikprogrammeerimisel saate selle mooduli teisaldamiseks rakendada pythoni objektid klientide ja serverite vahel.

Kuidas kasutada hapukurkmoodulit pythoni objektistruktuuride ülekandmiseks?

Kui kasutate hapukurki koos pistikupesadega, saate võrgu kaudu kõike absoluutselt üle kanda. Kirjutame serveripoolsed ja kliendipoolsed vasted üles, et serverist loend kliendile üle kanda:

Serveripoolne:

impordi pesa impordi hapukurk a = 10 s = pesa.pesa (pesa.AF_INET, pesa.SOCK_STREAM) s.bind ((pesa.gethostname (), 2133)) #binding tuple s.kuula (5), tõsi: clt, adr = s.accept () print (f'Ühendus teenusega {adr} loodud ') m = {1:' Klient ', 2:' Server '} mymsg = pickle.dumps (m) #sõnum, mille tahame hiljem printida mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

Siin on m sõnastik, mis on põhimõtteliselt a mis tuleb serverist kliendile saata. Seda tehakse esmalt objekti seeriate abil dumps () abil ja seejärel teisendatakse see baitideks.
Nüüd kirjutame üles kliendipoolse vaste:

Kliendipool:

impordi pesa impordi hapukurk a = 10 s = pesa.pesa (pesa.AF_INET, pesa.SOCK_STREAM) s.ühendus ((pesa.gethostname (), 2133)), kui tõene: täielik_info = b '' rec_msg = tõsi, kui tõene: = s.recv (10) kui rec_msg: print (f'Sõnumi pikkus = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = Vale täielik_info + = mymsg, kui len (täielik_info) -a == x: print ('Saanud täieliku teabe') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b '' print (complete_info )

Esimene while-silmus aitab meil jälgida nii täielikku sõnumit (complete_info) kui ka puhvrit kasutades vastuvõetavat sõnumit (rec_msg). sõnum seadistades rec_
Siis, kui sõnum on vastu võetud, printin vaid selle iga biti, saades selle vastu puhvris, mille suurus on 10. See suurus võib olla ükskõik milline, olenevalt teie isiklikust valikust.

Siis, kui vastuvõetud sõnum on võrdne täieliku sõnumiga, prindin sõnumi lihtsalt vastuvõetud täieliku infona, mille järel olen sõnumi koormuste () abil seerialiseerinud.

Ülaltoodud programmi väljund on järgmine:

See viib meid selle Pythoni Socket-programmeerimise artikli lõppu. Loodan, et saite kõikidest mõistetest selgelt aru.

Harjutage kindlasti nii palju kui võimalik ja pöörake oma kogemused tagasi.

Kas teil on meile küsimus? Palun mainige seda selle ajaveebi „Socket Programming in Python” kommentaaride jaotises ja võtame teiega ühendust niipea kui võimalik.

Põhjalike teadmiste saamiseks Pythoni ja selle erinevate rakenduste kohta saate registreeruda otseülekandeks 24/7 toe ja ligipääsuga kogu eluks.