Hva er Socket Programming i Python og hvordan mestrer du det?



Lær hva som er Socket Programming i Python sammen med klient-server-kommunikasjon sammen med overføring av python-objekter ved hjelp av pickle og sockets.

Internett har unektelig blitt 'Soul of Existence' og dets aktivitet er preget av 'Connections' eller 'Networks'. Disse nettverkene er muliggjort ved hjelp av en av de viktigste faktorene i Stikkontakter. Denne artikkelen dekker alle områder som arbeider med Socket Programming i Python. Stikkontakter hjelper deg med å lage disse tilkoblingene, mens utvilsomt gjør det enkelt.

La oss se raskt på alle temaene som dekkes i denne artikkelen:





Hvorfor bruke stikkontakter?
Hva er stikkontakter i Python?
Hvordan oppnå Socket-programmering i Python
Hva er en server?
Hva er en klient?
Echo Client-Server
Flere kommunikasjoner
Overføre Python-objekter



Hvorfor bruke stikkontakter?

Stikkontakter er ryggraden i nettverk. De muliggjør overføring av informasjon mellom to forskjellige programmer eller enheter. Når du for eksempel åpner nettleseren din, oppretter du som klient en forbindelse til serveren for overføring av informasjon.

Før vi dykker dypere inn i denne kommunikasjonen, la oss først finne ut hva som er disse kontaktene.

Hva er stikkontakter?

Generelt sett er stikkontakter innvendige endepunkter bygget for sending og mottak av data. Et enkelt nettverk vil ha to stikkontakter, en for hver kommunikasjonsenhet eller hvert program. Disse kontaktene er en kombinasjon av en IP-adresse og en port. En enkelt enhet kan ha ‘n’ antall kontakter basert på portnummeret som brukes. Forskjellige porter er tilgjengelige for forskjellige typer protokoller. Ta en titt på følgende bilde for mer om noen av de vanlige portnumrene og de tilhørende protokollene:




vanlige porter-SocketProgramminginPython-Edureka

Nå som du er klar over begrepet stikkontakter, la oss nå ta en titt på Socket-modulen til Python:

Slik oppnår du Socket-programmering i Python:

For å oppnå Socket-programmering i Python, må du importere stikkontakt modul eller . Denne modulen består av innebygde metoder som kreves for å lage stikkontakter og hjelpe dem med å omgås hverandre.

Noen av de viktige metodene er som følger:

MetoderBeskrivelse

socket.socket ()

brukes til å opprette stikkontakter (kreves både på serveren og i klientendene for å opprette stikkontakter)

socket.accept ()

brukes til å godta en forbindelse. Den returnerer et par verdier (conn, adresse) der conn er et nytt sokkelobjekt for sending eller mottak av data og adresse er adressen til sokkelen som er tilstede i den andre enden av forbindelsen

socket.bind ()

brukes til å binde til adressen som er spesifisert som en parameter

socket.close ()

brukes til å merke stikkontakten som lukket

socket.connect ()

brukes til å koble til en ekstern adresse spesifisert som parameter

socket.listen ()

gjør det mulig for serveren å godta tilkoblinger

Nå som du har forstått viktigheten av socket-modul, la oss gå videre for å se hvordan det kan tjene til å lage servere og klienter for Socket-programmering i .

Hva er en server?

En server er enten et program, en datamaskin eller en enhet som er viet til å administrere nettverksressurser. Servere kan enten være på samme enhet eller datamaskin eller lokalt koblet til andre enheter og datamaskiner eller til og med ekstern. Det finnes forskjellige typer servere som databaseservere, nettverksservere, utskriftsservere, etc.

hvorfor trenger vi serialisering i java

Servere bruker ofte metoder som socket.socket (), socket.bind (), socket.listen () osv. For å opprette en forbindelse og binde til klientene. La oss nå skrive et program for å opprette en server. Tenk på følgende eksempel:

EKSEMPEL:

import stikkontakt s = stikkontakt.stikkontakt (stikkontakt.AF_INET, stikkontakt.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) #portnummer kan være alt mellom 0-65535 (vi spesifiserer vanligvis ikke-privilegerte porter som er > 1023) s.listen (5) mens True: clt, adr = s.accept () print (f'Connection to {adr} opprettet ') #f streng er bokstavelig streng foran f som # inneholder pythonuttrykk inne i seler .send (bytes ('Socket Programming in Python', 'utf-8')) # for å sende informasjon til clientsocket

Som du kan se, er den første nødvendigheten av å opprette en stikkontakt å importere stikkontaktmodulen. Deretter brukes metoden socket.socket () til å opprette en server-kontakten.

MERK:

AF_INET refererer til Adresse fra Internett, og det krever et par (vert, port) hvor verten enten kan være en URL til et bestemt nettsted eller dets adresse, og portnummeret er et helt tall. SOCK_STREAM brukes til å lage TCP-protokoller.

Metoden bind () godtar to parametere som en tuple (vert, port). Det er imidlertid bedre å bruke firesifrede portnumre, da de nederste vanligvis er opptatt. Metoden listen () lar serveren godta tilkoblinger. Her er 5 køen for flere tilkoblinger som kommer opp samtidig. Minimumsverdien som kan spesifiseres her er 0 (hvis du gir en mindre verdi, endres den til 0). Hvis ingen parameter er spesifisert, tar det en standard egnet parameter.

De tillater å akseptere forbindelser for alltid. ‘Clt’ og ‘adr’ er klientobjektet og adressen. Utskriftserklæringen skriver bare ut adressen og portnummeret til klientkontakten. Til slutt brukes clt.send til å sende dataene i byte.

Nå som serveren vår er klar, la oss gå videre mot klienten.

Hva er en klient?

En klient er enten en datamaskin eller programvare som mottar informasjon eller tjenester fra serveren. I en klient-server-modul, forespørsler om tjenester fra servere. Det beste eksemplet er en nettleser som Google Chrome, Firefox, etc. Disse nettleserne ber om webservere for de nødvendige nettsidene og tjenestene som anvist av brukeren. Andre eksempler inkluderer online spill, online chatter, etc.

La oss nå ta en titt på hvordan du koder programmet på klientsiden :

EKSEMPEL:

importstikkontakt s = stikkontakt.stikkontakt (stikkontakt.AF_INET, stikkontakt.SOCK_STREAM) s.kobling ((socket.gethostname (), 2346)) msg ​​= s.recv (1024) utskrift (msg.decode ('utf-8') )

Det første trinnet er å importere stikkontaktmodulen og deretter opprette en stikkontakt akkurat som du gjorde mens du opprettet en server. Deretter, for å opprette en forbindelse mellom klientserveren, må du bruke tilkoblingsmetoden () ved å spesifisere (vert, port).


MERK: gethostname brukes når klient og server er på samme datamaskin. (LAN - localip / WAN - publicip)

Her ønsker klienten å motta litt informasjon fra serveren, og for dette må du bruke metoden recv (), og informasjonen lagres i en annen variabel msg. Bare husk at informasjonen som sendes vil være i byte, og at klienten i programmet ovenfor kan motta opptil 1024 byte (bufferstørrelse) i en enkelt overføring. Det kan spesifiseres til hvilket som helst beløp avhengig av mengden informasjon som overføres.

Til slutt skal meldingen som overføres dekodes og skrives ut.

Nå som du er klar over hvordan du lager klient-serverprogrammer, kan vi gå videre for å se hvordan de må utføres.

Ekko klient-server:

For å utføre disse programmene, åpne kommandoprompten, gå inn i mappen der du har opprettet klient- og serverprogrammet og skriv deretter:

py server.py (her, server.py er filnavnet til serveren, du kan også bruke py -3.7 server.py)

Når dette er gjort, starter serveren. For å utføre klienten, åpne et nytt cmd-vindu og skriv:

py client.py (her, client.py er filnavnet til klienten)

UTGANG (SERVER):

hvordan du avslutter en metode i java

(KLIENT)

La oss prøve det samme programmet ved å redusere bufferstørrelsen til 7 og se hvilken effekt vi får:

PRODUKSJON:

Som du ser, blir forbindelsen avsluttet etter overføring av 7 byte. Men dette er et problem fordi du ikke har mottatt den fullstendige informasjonen og forbindelsen er stengt. La oss fortsette med å løse dette problemet.

Flere kommunikasjoner:

For at forbindelsen skal fortsette til klienten mottar fullstendig informasjon, kan du benytte deg av mens loop:

EKSEMPEL:

importstikkontakt s = stikkontakt (stikkontakt.AF_INET, stikkontakt.SOCK_STREAM) s.kobling ((stikkontakt.hostnavn (), 2346)) mens True: msg = s.recv (7) skriv ut (msg.decode ('utf- 8 '))

Når du har gjort dette, vil den komplette meldingen mottas i 7 byte per overføring.

Men denne gangen, som du kan se, blir ikke forbindelsen avsluttet, og du vet aldri når det kommer til å skje. Og for å legge til dette, hva om du faktisk ikke vet hvor stor meldingen eller informasjonen klienten vil motta fra serveren. I slike tilfeller kan du faktisk bruke følgende kode på klientsiden:

EKSEMPEL:

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

På serversiden bruker du lukkemetoden () som følger:

clt.close ()

Resultatet av dette vil være som vist på bildet nedenfor:

PRODUKSJON:



Alt den ovennevnte kodeblokken gjør er å kontrollere størrelsen på informasjonen og skrive den ut i en buffer på to byte om gangen pluss å lukke forbindelsen etter at den er fullført.

Overføre Python-objekter:

Til her har du akkurat fått muligheten til å overføre strenger. Men, Socket Programmering i Python lar deg også overføre Python-objekter også. Disse objektene kan være alt som sett, tupler, ordbøker, etc. For å oppnå dette, må du importere pickle-modulen til Python.

Python pickle-modul:

Python pickle-modul kommer inn i bildet når du faktisk serialiserer eller avserialiserer objekter i python. La oss se på et lite eksempel,

EKSEMPEL:

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

PRODUKSJON: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ’

Som du kan se, i ovennevnte program, blir 'mylist' seriellisert ved hjelp av dumps () -funksjonen til pickle-modulen. Legg også merke til at utgangen starter med en 'b', noe som betyr at den blir konvertert til byte. I sokkelprogrammering kan du implementere denne modulen for å overføre python-objekter mellom klienter og servere.

Hvordan bruke pickle-modulen til å overføre python-objektstrukturer?

Når du bruker sylteagurk sammen med stikkontakter, kan du absolutt overføre alt gjennom nettverket. La oss skrive ned server-siden og klientsiden for å overføre en liste fra serveren til klienten:

Server-side:

import stikkontakt 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 () utskrift (f'Tilkobling til {adr} opprettet ') m = {1:' Client ', 2:' Server '} mymsg = pickle.dumps (m) # the msg we want to print later mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

Her er m en ordbok som i utgangspunktet er en som må sendes fra serveren til klienten. Dette gjøres ved først å serialisere objektet ved hjelp av dump () og deretter konvertere det til byte.
La oss nå skrive ned motparten på klientsiden:

Klient side:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2133)) mens True: complete_info = b '' rec_msg = True mens True: mymsg = s.recv (10) hvis rec_msg: skriv ut (f'Lengden på meldingen = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = Falsk komplett_info + = mymsg hvis len (komplett_info) -a == x: print ('Mottatt den komplette informasjonen') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b '' print (complete_info )

Den første mens sløyfen vil hjelpe oss med å holde oversikt over den fullstendige meldingen (complete_info) så vel som meldingen som mottas (rec_msg) ved hjelp av bufferen. meldingen ved å stille inn rec_
Så mens meldingen mottas, er alt jeg gjør å skrive ut hver bit av den, mottas i en buffer i størrelse 10. Denne størrelsen kan være hva som helst, avhengig av ditt personlige valg.

Så, hvis den mottatte meldingen er lik den komplette meldingen, skriver jeg bare ut meldingen som mottatt fullstendig info, hvoretter jeg har de-serialisert meldingen ved hjelp av belastninger ().

Resultatet til programmet ovenfor er som følger:

Dette bringer oss til slutten av denne artikkelen om Socket Programming i Python. Jeg håper du forsto alle konseptene tydelig.

Forsikre deg om at du trener så mye som mulig og tilbakestiller opplevelsen.

Har du et spørsmål til oss? Vennligst nevn det i kommentarfeltet i denne 'Socket Programming in Python' -bloggen, så kommer vi tilbake til deg så snart som mulig.

For å få inngående kunnskap om Python sammen med de forskjellige applikasjonene, kan du registrere deg for live med 24/7 support og levetidstilgang.