Čo je programovanie zásuviek v Pythone a ako ich zvládnuť?



Zistite, čo je programovanie soketov v Pythone spolu s komunikáciou klient-server spolu s prenosom objektov pythonu pomocou nálevu a zásuviek.

Internet sa nepopierateľne stal „dušou existencie“ a jeho činnosť charakterizujú „spojenia“ alebo „siete“. Tieto siete sú možné pomocou jedného z najdôležitejších základov systému Zásuvky. Tento článok sa venuje všetkým oblastiam zaoberajúcim sa programovaním zásuviek v Pythone. Zásuvky vám pomôžu tieto spojenia vytvoriť , nepochybne uľahčuje.

Poďme sa rýchlo pozrieť na všetky témy, ktorým sa venuje tento článok:





Prečo používať zásuvky?
Čo sú zásuvky v Pythone?
Ako dosiahnuť programovanie zásuviek v Pythone
Čo je server?
Čo je klient?
Echo klient-server
Viacnásobná komunikácia
Prenos objektov Pythonu



Prečo používať zásuvky?

Patice sú chrbticou siete. Umožňujú prenos informácií medzi dvoma rôznymi programami alebo zariadeniami. Napríklad keď otvoríte prehľadávač, vy ako klient vytvárate spojenie so serverom na účely prenosu informácií.

Pred ponorením sa do tejto komunikácie sa najskôr pozrime, čo presne sú tieto zásuvky.

Čo sú zásuvky?

Vo všeobecnosti sú zásuvky vnútorné koncové body vytvorené na odosielanie a prijímanie údajov. Jedna sieť bude mať dve zásuvky, jednu pre každé komunikujúce zariadenie alebo program. Tieto zásuvky sú kombináciou adresy IP a portu. Jedno zariadenie môže mať počet zásuviek „n“ na základe použitého čísla portu. Pre rôzne typy protokolov sú k dispozícii rôzne porty. Na nasledujúcom obrázku sa dozviete viac o niektorých bežných číslach portov a súvisiacich protokoloch:




spoločné porty-SocketProgramminginPython-Edureka

Teraz, keď máte jasno v koncepcii zásuviek, sa teraz pozrime na modul Socket v Pythone:

Ako dosiahnuť programovanie zásuviek v Pythone:

Aby ste dosiahli programovanie zásuviek v Pythone, budete musieť importovať zásuvka modul alebo . Tento modul obsahuje vstavané metódy, ktoré sú potrebné na vytváranie zásuviek a pomáhajú im pri vzájomnom združovaní.

Niektoré z dôležitých metód sú tieto:

MetódyPopis

socket.socket ()

slúži na vytvorenie zásuviek (vyžaduje sa na vytvorenie servera na serveri aj na konci klienta)

socket.accept ()

slúži na prijatie spojenia. Vráti dvojicu hodnôt (conn, address), kde conn je nový objekt soketu na odosielanie alebo prijímanie údajov a address je adresa soketu prítomného na druhom konci spojenia.

socket.bind ()

používa sa na naviazanie na adresu, ktorá je zadaná ako parameter

socket.close ()

slúži na označenie zásuvky ako uzavretej

socket.connect ()

slúži na pripojenie k vzdialenej adrese zadanej ako parameter

socket.listen ()

umožňuje serveru prijímať pripojenia

Teraz, keď ste pochopili dôležitosť zásuvkového modulu, poďme sa pozrieť na to, ako môže slúžiť na vytváranie serverov a klientov pre programovanie zásuviek v .

Čo je server?

Server je program, počítač alebo zariadenie určené na správu sieťových prostriedkov. Servery môžu byť buď na rovnakom zariadení alebo počítači, alebo môžu byť lokálne pripojené k iným zariadeniam a počítačom alebo dokonca vzdialené. Existujú rôzne typy serverov, ako sú databázové servery, sieťové servery, tlačové servery atď.

Servery na nadviazanie spojenia a naviazanie na klientov bežne používajú metódy ako socket.socket (), socket.bind (), socket.listen () atď. Teraz napíšeme program na vytvorenie servera. Uvažujme o nasledujúcom príklade:

PRÍKLAD:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) # číslo portu môže byť čokoľvek medzi 0-65535 (zvyčajne uvádzame neprevažované porty, ktoré sú > 1023) s.listen (5) while True: clt, adr = s.accept () print (f'Connection to {adr} established ') #f string je doslovný reťazec s predponou f, ktorá # obsahuje výrazy pythonu vo vnútri zložených zátvoriek clt .send (bytes ('Socket Programming in Python', 'utf-8')) #to send info to clientsocket

Ako vidíte, prvou nevyhnutnosťou vytvorenia soketu je importovanie soketového modulu. Potom sa pomocou metódy socket.socket () vytvorí soket na strane servera.

POZNÁMKA:

AF_INET označuje adresu z Internetu a vyžaduje dvojicu (hostiteľ, port), kde hostiteľom môže byť buď adresa URL konkrétnej webovej stránky, alebo jej adresa a číslo portu je celé číslo. SOCK_STREAM sa používa na vytváranie protokolov TCP.

aký je rozdiel medzi xml a html

Metóda bind () prijíma dva parametre ako n-ticu (hostiteľ, port). Je však lepšie používať štvormiestne čísla portov, pretože tie nižšie sú zvyčajne obsadené. Metóda listen () umožňuje serveru prijímať pripojenia. 5 je tu fronta pre viac pripojení, ktoré prichádzajú naraz. Minimálna hodnota, ktorú je možné tu určiť, je 0 (Ak dáte menšiu hodnotu, zmení sa na 0). Ak nie je zadaný žiadny parameter, použije sa predvolený vhodný.

The umožňuje navždy prijímať spojenia. „Clt“ a „adr“ sú objekt a adresa klienta. Tlačový výpis iba vytlačí adresu a číslo portu klientskej zásuvky. Nakoniec sa clt.send použije na odoslanie údajov v bajtoch.

Teraz, keď je náš server nastavený, poďme ďalej ku klientovi.

Čo je klient?

Klientom je počítač alebo softvér, ktorý prijíma informácie alebo služby zo servera. V module klient-server klient požaduje služby zo serverov. Najlepším príkladom je webový prehľadávač, ako je Google Chrome, Firefox atď. Tieto webové prehľadávače požadujú od webových serverov požadované webové stránky a služby podľa pokynov používateľa. Medzi ďalšie príklady patria online hry, online chaty atď.

Poďme sa teraz pozrieť na to, ako kódovať program na strane klienta :

PRÍKLAD:

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

Prvým krokom je import modulu soketu a následné vytvorenie soketu, ako ste to urobili pri vytváraní servera. Potom, aby ste vytvorili spojenie medzi klientom a serverom, budete musieť použiť metódu connect () zadaním (hostiteľ, port).


POZNÁMKA: gethostname sa používa, keď sú klient a server zapnuté v rovnakom počítači. (LAN - localip / WAN - publicip)

Tu chce klient dostávať nejaké informácie zo servera, a preto je potrebné použiť metódu recv () a tieto informácie sa ukladajú do inej premennej msg. Nezabudnite, že odovzdávané informácie budú v bajtoch a klient vo vyššie uvedenom programe môže prijať až 1024 bajtov (veľkosť vyrovnávacej pamäte) v jednom prenose. Môže byť špecifikovaná na ľubovoľné množstvo v závislosti od množstva prenášaných informácií.

Nakoniec by sa mala prenášaná správa dekódovať a vytlačiť.

Teraz, keď už viete, ako vytvárať programy typu klient-server, poďme ďalej k tomu, ako je potrebné ich vykonať.

Echo klient-server:

Ak chcete vykonať tieto programy, otvorte príkazový riadok, vstúpte do priečinka, v ktorom ste vytvorili program klienta a servera, a zadajte:

py server.py (tu server.py je názov servera, môžete tiež použiť py -3.7 server.py)

Po dokončení sa server spustí. Ak chcete klienta spustiť, otvorte ďalšie okno cmd a zadajte:

py client.py (tu client.py je názov súboru klienta)

VÝSTUP (SERVER):

(ZÁKAZNÍK)

Skúsme ten istý program zmenšením veľkosti medzipamäte na 7 a pozrime sa, aký výstup dostaneme:

VÝKON:

Ako vidíte, pripojenie je ukončené po prenose 7 bajtov. Ale toto je problém, pretože ste nedostali úplné informácie a spojenie je ukončené. Poďme vyriešiť tento problém.

Viacnásobná komunikácia:

Aby pripojenie mohlo pokračovať, kým klient nedostane úplné informácie, môžete využiť slučku while:

k sile javy

PRÍKLAD:

importovať zásuvku s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) while True: msg = s.recv (7) print (msg.decode ('utf- 8 '))

Keď to urobíte, celá správa bude prijatá v 7 bajtoch na jeden prevod.

Ako však vidíte, tentokrát sa spojenie neukončí a nikdy neviete, kedy sa to stane. A ešte k tomu, čo ak skutočne neviete, aká veľká je správa alebo informácia, ktorú klient od servera dostane. V takýchto prípadoch môžete na strane klienta skutočne použiť nasledujúci bit kódu:

PRÍKLAD:

complete_info = '' while True: msg = s.recv (7) if len (msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

Na strane servera použite metódu close () nasledovne:

clt.close ()

Výstup bude taký, ako je znázornené na obrázku nižšie:

VÝKON:



Všetko, čo vyššie uvedený blok kódu robí, je kontrola veľkosti informácií a ich tlač do medzipamäte s veľkosťou dvoch bajtov súčasne a ukončenie spojenia po dokončení.

Prenos objektov Pythonu:

Až do teraz tu máte talent na prenos strún. Ale programovanie zásuviek vo Windows Python umožňuje tiež prenášať objekty Pythonu. Týmito objektmi môžu byť čokoľvek ako množiny, n-tice, slovníky atď. Aby ste to dosiahli, budete musieť importovať nakladací modul z Pythonu.

Modul na nakladanie v Pythone:

Modul na nakladanie v Pythone sa objaví, keď skutočne serializujete alebo de-serializujete objekty v Pythone. Pozrime sa na malý príklad,

PRÍKLAD:

import pickle mylist = [1,2, 'abc'] mymsg = pickle.dumps (mylist) tlač (mymsg)

VÝKON: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. “

Ako vidíte, vo vyššie uvedenom programe je program „mylist“ serializovaný pomocou funkcie dumps () modulu na nakladanie. Upozorňujeme tiež, že výstup začína písmenom b, čo znamená, že sa prevádza na bajty. V programovaní zásuviek môžete tento modul implementovať na prenos pythonove objekty medzi klientmi a servermi.

Ako používať modul na nakladanie na prenos štruktúr objektu python?

Ak použijete nálev spolu so zásuvkami, môžete absolútne nič preniesť cez sieť. Poďme si zapísať náprotivky na strane servera a na strane klienta a preniesť zoznam zo servera na klienta:

Na strane servera:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 2133)) #binding n-tica s.listen (5) while True: clt, adr = s.accept () print (f'Pripojenie k {adr} bolo založené ') m = {1:' Klient ', 2:' Server '} mymsg = pickle.dumps (m) # správa, ktorú chceme vytlačiť neskôr mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

Tu je m slovník, ktorý je v podstate a ktoré je potrebné poslať zo servera klientovi. To sa deje tak, že najskôr serializujete objekt pomocou dumps () a potom ho prevediete na bajty.
Teraz si napíšeme náprotivok na strane klienta:

Na strane klienta:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2133)) while True: complete_info = b 'rec_msg = True while True: mymsg = s.recv (10) if rec_msg: print (f'The length of message = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = False complete_info + = mymsg if len (complete_info) -a == x: print ('Dostal kompletné informácie') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = Pravda Complete_info = b '' print (complete_info )

Smyčka first while nám pomôže sledovať celú správu (complete_info), ako aj správu, ktorá je prijímaná (rec_msg) pomocou medzipamäte. správu nastavením rec_
Potom, keď sa správa prijíma, robím iba to, že tlačím každý jej bit a prijímam ju do vyrovnávacej pamäte veľkosti 10. Táto veľkosť môže byť akákoľvek, v závislosti od vášho osobného výberu.

Ak sa potom prijatá správa rovná úplnej správe, tlačím správu ako prijatú úplnú informáciu, po ktorej som správu de-serializoval pomocou načítania ().

Výstup do vyššie uvedeného programu je nasledovný:

Týmto sa dostávame na koniec tohto článku o Socket Programming v Pythone. Dúfam, že ste všetky pojmy pochopili jasne.

Určite cvičte čo najviac a obráťte sa na svoje skúsenosti.

Máte na nás otázku? Uveďte to prosím v sekcii komentárov v tomto blogu „Programovanie zásuviek v Pythone“ a my sa vám ozveme čo najskôr.

Ak chcete získať podrobné informácie o Pythone a jeho rôznych aplikáciách, môžete sa zaregistrovať naživo s nepretržitou podporou a doživotným prístupom.