Što je Socket programiranje u Pythonu i kako ga svladati?



Saznajte što je Socket programiranje u Pythonu, zajedno s komunikacijom klijent-poslužitelj, zajedno s prijenosom python objekata pomoću kiselog krastavca i utičnica.

Internet je nesumnjivo postao 'Duša postojanja', a njegovu aktivnost karakteriziraju 'Veze' ili 'Mreže'. Te su mreže omogućene pomoću jednog od najvažnijih osnova Utičnice. Ovaj članak pokriva sva područja koja se bave programiranjem soketa u Pythonu. Utičnice vam pomažu dok ne uspostavite ove veze , nesumnjivo, olakšava.

Kratko ćemo pogledati sve teme obrađene u ovom članku:





Zašto koristiti utičnice?
Što su utičnice u Pythonu?
Kako postići Socket programiranje u Pythonu
Što je poslužitelj?
Što je klijent?
Echo klijent-poslužitelj
Višestruke komunikacije
Prijenos Python objekata



Zašto koristiti utičnice?

Utičnice su okosnica umrežavanja. Omogućuju prijenos informacija između dva različita programa ili uređaja. Na primjer, kada otvorite svoj preglednik, vi kao klijent stvarate vezu s poslužiteljem za prijenos podataka.

Prije nego što zađemo dublje u ovu komunikaciju, prvo shvatimo koje su točno to utičnice.

Što su utičnice?

Općenito govoreći, utičnice su unutarnje krajnje točke izgrađene za slanje i primanje podataka. Jedna će mreža imati dvije utičnice, po jednu za svaki komunikacijski uređaj ili program. Te utičnice kombinacija su IP adrese i porta. Pojedinačni uređaj može imati ‘n’ broj utičnica na temelju broja priključka koji se koristi. Dostupni su različiti priključci za različite vrste protokola. Pogledajte sljedeću sliku da biste saznali više o nekim uobičajenim brojevima priključaka i povezanim protokolima:




uobičajene luke-SocketProgramminginPython-Edureka

Sad kad vam je jasan koncept soketa, pogledajmo sada modul Socket Pythona:

Kako postići Socket programiranje u Pythonu:

Da biste postigli Socket programiranje u Pythonu, morat ćete uvesti datoteku utičnica modul ili . Ovaj se modul sastoji od ugrađenih metoda potrebnih za stvaranje utičnica i pomaže im da se međusobno povežu.

Neke od važnih metoda su sljedeće:

MetodeOpis

socket.socket ()

koristi se za stvaranje utičnica (potrebno je i na poslužitelju i na klijentskim krajevima za stvaranje utičnica)

socket.accept ()

pretvoriti iz dvostrukog u int java
koristi se za prihvaćanje veze. Vraća par vrijednosti (conn, adresa) gdje je conn novi objekt utičnice za slanje ili primanje podataka, a adresa je adresa utičnice prisutna na drugom kraju veze

socket.bind ()

koristi se za vezanje na adresu koja je navedena kao parametar

socket.close ()

koristi se za označavanje utičnice kao zatvorene

socket.connect ()

koristi se za povezivanje s udaljenom adresom navedenom kao parametar

socket.listen ()

omogućuje poslužitelju prihvaćanje veza

Sad kad ste shvatili važnost socket modula, krenimo dalje da vidimo kako on može poslužiti za stvaranje poslužitelja i klijenata za Socket programiranje u .

Što je poslužitelj?

Poslužitelj je program, računalo ili uređaj koji je posvećen upravljanju mrežnim resursima. Poslužitelji mogu biti na istom uređaju ili računalu ili lokalno povezani s drugim uređajima i računalima ili čak na daljinu. Postoje razne vrste poslužitelja poput poslužitelja baza podataka, mrežnih poslužitelja, poslužitelja za ispis itd.

Poslužitelji se obično koriste metodama poput socket.socket (), socket.bind (), socket.listen () itd. Da bi uspostavili vezu i vezali se za klijente. Napišimo sada program za stvaranje poslužitelja. Razmotrimo sljedeći primjer:

PRIMJER:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) # broj porta može biti bilo što između 0-65535 (obično određujemo neprivilegirane portove koji su > 1023) s.listen (5) while True: clt, adr = s.accept () print (f'Povezivanje na {adr} uspostavljeno ') #f string je doslovni niz s prefiksom f koji # sadrži python izraze unutar zagrada clt .send (bytes ('Programiranje utičnice u Pythonu', 'utf-8')) # za slanje podataka na clientocket

Kao što vidite, prva potreba za stvaranjem utičnice je uvoz modula utičnice. Nakon toga metoda socket.socket () koristi se za stvaranje utičnice na strani poslužitelja.

BILJEŠKA:

AF_INET odnosi se na Adresa s Interneta i potreban mu je par (host, port) gdje host može biti URL određenog web mjesta ili njegova adresa, a broj porta je cijeli broj. SOCK_STREAM koristi se za stvaranje TCP protokola.

Metoda bind () prihvaća dva parametra kao skup (host, port). Međutim, bolje je koristiti brojeve priključaka s 4 znamenke jer su niži obično zauzeti. Način Listen () omogućuje poslužitelju prihvaćanje veza. Ovdje je 5 red za više veza koje se istodobno pojavljuju. Minimalna vrijednost koja se ovdje može navesti je 0 (Ako date manju vrijednost, ona se mijenja u 0). U slučaju da nije naveden parametar, potreban je zadani prikladni.

The omogućuje prihvaćanje veza zauvijek. 'Clt' i 'adr' su objekt i adresa klijenta. Izvod za ispis samo ispisuje adresu i broj porta klijentske utičnice. Konačno, clt.send koristi se za slanje podataka u bajtovima.

Sad kad je naš poslužitelj postavljen, krenimo prema klijentu.

Što je klijent?

Klijent je računalo ili softver koji prima informacije ili usluge od poslužitelja. U modulu klijent-poslužitelj klijenti zahtijevaju usluge od poslužitelja. Najbolji primjer je web preglednik kao što je Google Chrome, Firefox itd. Ovi web preglednici zahtijevaju web poslužitelje za potrebne web stranice i usluge prema uputama korisnika. Ostali primjeri uključuju mrežne igre, internetske razgovore itd.

Sada pogledajmo kako kodirati program na strani klijenta :

PRIMJER:

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') )

Prvi korak je uvoz modula utičnice, a zatim stvaranje utičnice baš kao što ste to činili tijekom stvaranja poslužitelja. Zatim, da biste stvorili vezu između klijent-poslužitelja, morat ćete upotrijebiti metodu connect () navođenjem (host, port).


BILJEŠKA: gethostname koristi se kada su klijent i poslužitelj na istom računalu. (LAN - localip / WAN - publicip)

Ovdje klijent želi primiti neke podatke od poslužitelja, a za to trebate koristiti metodu recv () i podaci se pohranjuju u drugu promjenjivu poruku. Samo imajte na umu da će se podaci koji se prenose biti u bajtovima, a klijent u gore navedenom programu može primiti do 1024 bajta (veličina međuspremnika) u jednom prijenosu. Može se odrediti na bilo koji iznos, ovisno o količini podataka koji se prenose.

Konačno, poruku koja se prenosi treba dekodirati i ispisati.

Sad kad ste svjesni kako stvoriti klijent-poslužiteljske programe, krenimo dalje da vidimo kako ih treba izvršiti.

Echo klijent-poslužitelj:

Da biste izvršili ove programe, otvorite naredbeni redak, uđite u mapu u kojoj ste kreirali program klijenta i poslužitelja, a zatim upišite:

py server.py (ovdje je server.py naziv datoteke poslužitelja, također možete koristiti py -3.7 server.py)

Nakon što se to učini, poslužitelj počinje raditi. Da biste izvršili klijenta, otvorite drugi cmd prozor i upišite:

py client.py (ovdje je client.py naziv datoteke klijenta)

IZLAZ (SERVER):

(KLIJENT)

Pokušajmo s istim programom smanjenjem veličine međuspremnika na 7 i vidjet ćemo kakav ćemo izlaz dobiti:

IZLAZ:

Kao što vidite, veza se prekida nakon prijenosa 7 bajtova. Ali to je problem jer niste dobili potpune informacije i veza je prekinuta. Krenimo s rješavanjem ovog problema.

Višestruke komunikacije:

Da bi veza trajala sve dok klijent ne dobije cjelovite informacije, možete koristiti while petlju:

PRIMJER:

import socket 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 '))

Nakon što to učinite, kompletna poruka primit će se u 7 bajtova po prijenosu.

Ali ovaj put, kao što vidite, veza se ne prekida i nikad ne znate kada će se to dogoditi. I da se tome dodamo, što ako zapravo ne znate kolika je poruka ili informacija koju će klijent primiti od poslužitelja. U takvim slučajevima zapravo možete koristiti sljedeći bit koda na klijentskoj strani:

PRIMJER:

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

Na strani poslužitelja koristite metodu close () kako slijedi:

clt.close ()

Rezultat će biti kao što je prikazano na donjoj slici:

IZLAZ:



Sve što gore navedeni blok koda čini jest provjera veličine podataka i ispis u međuspremniku od dva bajta odjednom plus zatvaranje veze nakon što je dovršena.

Prijenos Python objekata:

Do ovdje ste upravo stekli vještinu prenosa žica. Ali, Programiranje utičnica u sustavu Windows Piton također vam omogućuje prijenos Python objekata. Ti objekti mogu biti bilo što poput skupova, korijena, rječnika itd. Da biste to postigli, morat ćete uvesti modul za turšiju u Pythonu.

Python kiseli modul:

Python pickle modul pojavljuje se na slici kada zapravo serializirate ili uklanjate serializacije objekata u pythonu. Pogledajmo mali primjer,

PRIMJER:

uvoz krastavca mylist = [1,2, 'abc'] mymsg = pickle.dumps (mylist) print (mymsg)

IZLAZ: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ’

Kao što vidite, u gornjem programu se ‘mylist’ serializira pomoću funkcije dumps () modula turšija. Također zabilježite da izlaz počinje s 'b', što znači da se pretvara u bajtove. U programiranju soketa, ovaj modul možete implementirati za prijenos python objekti između klijenata i poslužitelja.

Kako koristiti modul kiseline za prijenos python objektnih struktura?

Kada upotrebljavate kiseli krastavac zajedno s utičnicama, apsolutno možete sve prenijeti putem mreže. Zapišite zapise na strani poslužitelja i klijenta za prijenos popisa s poslužitelja na klijenta:

Na strani poslužitelja:

import socket import pickle 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'Podružnica s {adr} uspostavljena ') m = {1:' Klijent ', 2:' Poslužitelj '} mymsg = pickle.dumps (m) # poruka koju želimo ispisati kasnije mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

Ovdje je m rječnik koji je u osnovi a koji treba poslati s poslužitelja klijentu. To se postiže tako da se prvo serializira objekt pomoću dampa (), a zatim se pretvori u bajtove.
Sada zapišimo pandan na strani klijenta:

Na strani klijenta:

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'Duljina poruke = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = False complete_info + = mymsg if len (complete_info) -a == x: print ('Primili kompletne informacije') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b '' print (complete_info )

Prva while petlja pomoći će nam da pratimo kompletnu poruku (complete_info), kao i poruku koja se prima (rec_msg) pomoću međuspremnika. poruka postavljanjem rec_
Zatim, dok se poruka prima, sve što radim je da ispisujem svaki njezin bit, primljen u međuspremnik veličine 10. Ta veličina može biti bilo što, ovisno o vašem osobnom izboru.

Zatim, ako je primljena poruka jednaka cjelovitoj poruci, samo ispisujem poruku kao primljenu potpunu informaciju, nakon čega sam deserijalizirao poruku pomoću load ().

Izlaz za gornji program je sljedeći:

Ovo nas dovodi do kraja ovog članka o Programiranju soketa u Pythonu. Nadam se da ste jasno razumjeli sve koncepte.

Obavezno vježbajte što je više moguće i vratite svoje iskustvo.

Imate pitanje za nas? Molimo vas da ga spominjete u odjeljku za komentare ovog bloga „Programiranje soketa u Pythonu“, a mi ćemo vam se javiti što je prije moguće.

Da biste stekli detaljno znanje o Pythonu, zajedno s raznim aplikacijama, možete se prijaviti uživo s 24/7 podrškom i doživotnim pristupom.