Ce este Socket Programming în Python și cum să îl stăpânești?



Aflați ce este Socket Programming în Python împreună cu comunicațiile client-server împreună cu transferul obiectelor python folosind pickle și sockets.

Internetul a devenit incontestabil „Sufletul existenței” și activitatea sa se caracterizează prin „Conexiuni” sau „Rețele”. Aceste rețele sunt posibile folosind unul dintre cele mai importante elemente fundamentale ale Prize. Acest articol acoperă toate domeniile care se ocupă de programarea socketului în Python. Soclurile vă ajută să realizați aceste conexiuni, în timp ce , fără îndoială, o ușurează.

Să aruncăm o privire rapidă asupra tuturor subiectelor acoperite în acest articol:





De ce să folosiți soclurile?
Ce sunt soclurile în Python?
Cum se realizează programarea Socket în Python
Ce este un server?
Ce este un client?
Echo Client-Server
Comunicări multiple
Transferul obiectelor Python



De ce să folosiți soclurile?

Soclurile sunt coloana vertebrală a rețelei. Acestea fac posibilă transferul de informații între două programe sau dispozitive diferite. De exemplu, atunci când deschideți browserul, în calitate de client, creați o conexiune la server pentru transferul de informații.

Înainte de a ne adânci în această comunicare, să ne dăm seama mai întâi care sunt exact aceste socluri.

Ce sunt soclurile?

În termeni generali, soclurile sunt puncte finale interioare construite pentru trimiterea și primirea de date. O singură rețea va avea două prize, una pentru fiecare dispozitiv sau program de comunicare. Aceste prize sunt o combinație între o adresă IP și un port. Un singur dispozitiv poate avea un număr „n” de socluri în funcție de numărul de port utilizat. Sunt disponibile diferite porturi pentru diferite tipuri de protocoale. Aruncați o privire la următoarea imagine pentru mai multe despre unele dintre numerele de port comune și protocoalele conexe:




porturi comune-SocketProgramminginPython-Edureka

Acum, că sunteți clar despre conceptul de sockets, să aruncăm o privire acum asupra modulului Socket al Python:

Cum se realizează programarea Socket în Python:

Pentru a realiza programarea Socket în Python, va trebui să importați fișierul priză modul sau . Acest modul constă din metode încorporate care sunt necesare pentru crearea soclurilor și pentru a le ajuta să se asocieze între ele.

Unele dintre metodele importante sunt următoarele:

MetodeDescriere

socket.socket ()

folosit pentru a crea socketuri (necesare atât pentru server, cât și pentru capete de client pentru a crea socketuri)

socket.accept ()

obișnuia să accepte o conexiune. Returnează o pereche de valori (conn, adresa) unde conn este un nou obiect socket pentru trimiterea sau primirea de date și adresa este adresa socketului prezent la celălalt capăt al conexiunii

socket.bind ()

folosit pentru a lega adresa care este specificată ca parametru

socket.close ()

folosit pentru a marca soclul ca închis

socket.connect ()

folosit pentru a vă conecta la o adresă la distanță specificată ca parametru

socket.listen ()

permite serverului să accepte conexiuni

Acum că ați înțeles importanța modulului socket, să trecem mai departe pentru a vedea cum poate servi la crearea de servere și clienți pentru Socket Programming în .

Ce este un server?

Un server este fie un program, un computer sau un dispozitiv dedicat gestionării resurselor de rețea. Serverele pot fi fie pe același dispozitiv sau computer sau conectate local la alte dispozitive și computere sau chiar la distanță. Există diferite tipuri de servere, cum ar fi servere de baze de date, servere de rețea, servere de imprimare etc.

Serverele folosesc în mod obișnuit metode precum socket.socket (), socket.bind (), socket.listen (), etc pentru a stabili o conexiune și a se lega de clienți. Acum să scriem un program pentru a crea un server. Luați în considerare următorul exemplu:

EXEMPLU:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) # numărul de port poate fi orice între 0-65535 (de obicei specificăm porturi non-privilegiate care sunt > 1023) s.listen (5) în timp ce True: clt, adr = s.accept () print (f'Conectare la {adr} stabilit ') #f șir este șir literal prefixat cu f care # conține expresii python în interiorul acoladelor .send (octeți ('Socket Programming in Python', 'utf-8')) # pentru a trimite informații către client

După cum puteți vedea, prima necesitate pentru a crea un socket este importul modulului socket. După aceea, metoda socket.socket () este utilizată pentru a crea un socket de pe server.

NOTĂ:

AF_INET se referă la Adresă de pe Internet și necesită o pereche de (gazdă, port) în care gazda poate fi fie o adresă URL a unui anumit site web, fie adresa acestuia, iar numărul portului este un număr întreg. SOCK_STREAM este utilizat pentru a crea protocoale TCP.

Metoda bind () acceptă doi parametri ca tuplu (gazdă, port). Cu toate acestea, este mai bine să utilizați numere de port din 4 cifre, deoarece cele inferioare sunt de obicei ocupate. Metoda listen () permite serverului să accepte conexiuni. Aici, 5 este coada pentru mai multe conexiuni care apar simultan. Valoarea minimă care poate fi specificată aici este 0 (Dacă dați o valoare mai mică, aceasta este schimbată la 0). În cazul în care nu este specificat niciun parametru, este nevoie de unul adecvat implicit.

permite acceptarea conexiunilor pentru totdeauna. „Clt” și „adr” sunt obiectul și adresa clientului. Declarația de tipărire tipărește doar adresa și numărul de port al soclului clientului. În cele din urmă, clt.send este utilizat pentru a trimite datele în octeți.

eticheta c ++ merge

Acum că serverul nostru este gata, să mergem mai departe către client.

Ce este un client?

Un client este fie un computer sau un software care primește informații sau servicii de la server. Într-un modul client-server, clienții solicită servicii de la servere. Cel mai bun exemplu este un browser web, cum ar fi Google Chrome, Firefox etc. Aceste browsere web solicită servere web pentru paginile și serviciile web necesare, conform instrucțiunilor utilizatorului. Alte exemple includ jocuri online, chat-uri online etc.

Acum să aruncăm o privire la modul de codificare a programului din partea clientului :

EXEMPLU:

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

Primul pas este să importați modulul socket și apoi să creați un socket la fel cum ați făcut în timp ce creați un server. Apoi, pentru a crea o conexiune între client-server, va trebui să utilizați metoda connect () specificând (gazdă, port).


NOTĂ: gethostname este utilizat atunci când clientul și serverul sunt pe același computer. (LAN - localip / WAN - publicip)

Aici, clientul dorește să primească unele informații de la server și pentru aceasta, trebuie să utilizați metoda recv () și informațiile sunt stocate într-o altă variabilă msg. Rețineți că informațiile transmise vor fi în octeți, iar clientul din programul de mai sus poate primi până la 1024 octeți (dimensiunea bufferului) într-un singur transfer. Poate fi specificat pentru orice sumă, în funcție de cantitatea de informații transferate.

În cele din urmă, mesajul transferat trebuie decodat și tipărit.

Acum, că știți cum să creați programe client-server, să trecem mai departe pentru a vedea cum trebuie executate.

Echo Client-Server:

Pentru a executa aceste programe, deschideți promptul de comandă, intrați în folderul în care ați creat programul client și server și apoi tastați:

py server.py (aici, server.py este numele fișierului serverului, puteți utiliza și py -3.7 server.py)

Odată ce acest lucru este făcut, serverul începe să ruleze. Pentru a executa clientul, deschideți o altă fereastră cmd și tastați:

py client.py (aici, client.py este numele de fișier al clientului)

IEȘIRE (SERVER):

(CLIENT)

Să încercăm același program prin reducerea dimensiunii bufferului la 7 și să vedem ce rezultat obținem:

IEȘIRE:

După cum puteți vedea, conexiunea se încheie după transferul a 7 octeți. Dar aceasta este o problemă, deoarece nu ați primit informațiile complete și conexiunea este închisă. Să continuăm să rezolvăm această problemă.

Comunicări multiple:

Pentru ca conexiunea să continue până când clientul primește informațiile complete, puteți utiliza bucla while:

EXEMPLU:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) în timp ce True: msg = s.recv (7) print (msg.decode ('utf- 8 '))

După ce faceți acest lucru, mesajul complet va fi primit în 7 octeți per transfer.

Dar de data aceasta, după cum puteți vedea, conexiunea nu se oprește și nu știți niciodată când se va întâmpla. Și pentru a adăuga la asta, ce se întâmplă dacă nu știți cât de mare este mesajul sau informațiile pe care clientul le va primi de la server. În astfel de cazuri, puteți utiliza de fapt următorul bit de cod din partea clientului:

EXEMPLU:

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

Pe partea de server utilizați metoda close () după cum urmează:

clt.close ()

Ieșirea acestuia va fi așa cum se arată în imaginea de mai jos:

IEȘIRE:



Tot ceea ce face blocul de cod de mai sus este să verifice dimensiunea informațiilor și să le tipărească într-un buffer de doi octeți la un moment dat, plus închiderea conexiunii după finalizare.

Transferul obiectelor Python:

Până aici tocmai ai priceputul de a transfera corzi. Dar, Socket Programming in Piton vă permite, de asemenea, să transferați și obiecte Python. Aceste obiecte pot fi asemănătoare unor seturi, tupluri, dicționare etc. Pentru a realiza acest lucru, va trebui să importați modulul de murături din Python.

Modul de murături Python:

Modulul de murături Python intră în imagine atunci când efectuați serializarea sau de-serializarea obiectelor din Python. Să aruncăm o privire la un mic exemplu,

EXEMPLU:

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

IEȘIRE: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ’

După cum puteți vedea, în programul de mai sus, „lista mea” este serializată utilizând funcția dumps () a modulului de murături. De asemenea, notați că ieșirea începe cu un „b”, adică este convertită în octeți. În programarea socket, puteți implementa acest modul pentru a transfera obiecte piton între clienți și servere.

Cum se folosește modulul de murături pentru a transfera structuri de obiecte python?

Când utilizați murătura împreună cu prize, puteți transfera absolut orice prin rețea. Să notăm partea serverului și partea omologă pentru a transfera o listă de la server către client:

Partea de server:

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) în timp ce True: clt, adr = s.accept () print (f'Conectare la {adr} stabilit ') m = {1:' Client ', 2:' Server '} mymsg = pickle.dumps (m) # mesajul pe care vrem să îl imprimăm mai târziu mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

Aici, m este un dicționar care este practic un care trebuie trimis de la server către client. Aceasta se face mai întâi serializând obiectul folosind dumps () și apoi convertindu-l în octeți.
Acum, să scriem omologul din partea clientului:

Partea client:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2133)) în timp ce True: complete_info = b 'rec_msg = True în timp ce True: mymsg = s.recv (10) if rec_msg: print (f'Lungimea mesajului = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = False complete_info + = mymsg if len (complete_info) -a == x: print ('A primit informațiile complete') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b '' print (complete_info )

Prima buclă while ne va ajuta să ținem evidența mesajului complet (complete_info), precum și a mesajului care este primit (rec_msg) folosind bufferul. mesajul prin setarea rec_
Apoi, în timp ce mesajul este recepționat, tot ceea ce fac este să imprim fiecare fișier din acesta, fiind primit într-un tampon de dimensiunea 10. Această dimensiune poate fi orice, în funcție de alegerea dvs. personală.

Apoi, dacă mesajul primit este egal cu mesajul complet, tipăresc mesajul ca informație completă primită, după care am dez serializat mesajul folosind încărcări ().

Ieșirea pentru programul de mai sus este următoarea:

Acest lucru ne duce la sfârșitul acestui articol despre Socket Programming in Python. Sper că ați înțeles clar toate conceptele.

Asigurați-vă că exersați cât mai mult posibil și reveniți la experiență.

Ai o întrebare pentru noi? Vă rugăm să o menționați în secțiunea de comentarii a acestui blog „Socket Programming in Python” și vă vom contacta cât mai curând posibil.

Pentru a obține cunoștințe aprofundate despre Python împreună cu diferitele sale aplicații, vă puteți înscrie pentru live cu suport 24/7 și acces pe viață.