Vad är Socket Programming i Python och hur man behärskar det?



Lär dig vad som är Socket Programming i Python tillsammans med klient-server-kommunikation tillsammans med att överföra python-objekt med pickle och sockets.

Internet har onekligen blivit ”Soul of Existence” och dess aktivitet kännetecknas av ”Connections” eller ”Networks”. Dessa nätverk möjliggörs med hjälp av en av de viktigaste grunderna i Uttag. Den här artikeln täcker alla områden som behandlar Socket-programmering i Python. Uttag hjälper dig att skapa dessa anslutningar medan utan tvekan gör det enkelt.

Låt oss ta en snabb titt på alla ämnen som behandlas i den här artikeln:





Varför använda uttag?
Vad är uttag i Python?
Hur man uppnår Socket-programmering i Python
Vad är en server?
Vad är en klient?
Echo Client-Server
Flera kommunikationer
Överföra Python-objekt



Varför använda uttag?

Sockets är ryggraden i nätverk. De möjliggör överföring av information mellan två olika program eller enheter. Till exempel när du öppnar din webbläsare skapar du som klient en anslutning till servern för överföring av information.

Innan vi dyker djupare in i denna kommunikation, låt oss först ta reda på vad exakt dessa uttag är.

Vad är uttag?

Generellt sett är uttag inre slutpunkter byggda för att skicka och ta emot data. Ett enda nätverk har två uttag, en för varje kommunikationsenhet eller program. Dessa uttag är en kombination av en IP-adress och en port. En enda enhet kan ha ett antal n-uttag baserat på det portnummer som används. Olika portar är tillgängliga för olika typer av protokoll. Ta en titt på följande bild för mer information om några vanliga portnummer och relaterade protokoll:




vanliga portar-SocketProgramminginPython-Edureka

Nu när du är klar med begreppet uttag, låt oss nu titta på Socket-modulen i Python:

Hur man uppnår Socket-programmering i Python:

För att uppnå Socket-programmering i Python måste du importera uttag modul eller . Den här modulen består av inbyggda metoder som krävs för att skapa uttag och hjälpa dem att umgås med varandra.

Några av de viktiga metoderna är följande:

MetoderBeskrivning

socket.socket ()

används för att skapa uttag (krävs både på servern och i klientändarna för att skapa uttag)

socket.accept ()

används för att acceptera en anslutning. Det returnerar ett par värden (anslutning, adress) där anslutning är ett nytt uttagsobjekt för att skicka eller ta emot data och adress är adressen till uttaget som finns i andra änden av anslutningen.

socket.bind ()

används för att binda till den adress som anges som en parameter

socket.close ()

används för att markera uttaget som stängt

socket.connect ()

används för att ansluta till en fjärradress som anges som parameter

socket.listen ()

gör det möjligt för servern att acceptera anslutningar

Nu när du har förstått vikten av uttagsmodulen, låt oss gå vidare för att se hur det kan tjäna att skapa servrar och klienter för Socket-programmering i .

Vad är en server?

En server är antingen ett program, en dator eller en enhet som ägnas åt hantering av nätverksresurser. Servrar kan antingen vara på samma enhet eller dator eller lokalt anslutna till andra enheter och datorer eller till och med fjärrkontroll. Det finns olika typer av servrar som databasservrar, nätverksservrar, skrivarservrar etc.

Servrar använder ofta metoder som socket.socket (), socket.bind (), socket.listen (), etc. för att upprätta en anslutning och binda till klienterna. Låt oss nu skriva ett program för att skapa en server. Tänk på följande exempel:

EXEMPEL:

importera uttaget s = uttaget. uttaget (uttaget.AF_INET, uttaget.SOCK_STREAM) > 1023) s.listen (5) medan True: clt, adr = s.accept () print (f'Anslutning till {adr} etablerad ') #f sträng är bokstavssträng prefixad med f som # innehåller pythonuttryck inuti hängslen clt .send (bytes ('Socket Programming in Python', 'utf-8')) # för att skicka information till clientsocket

Som du kan se är den första nödvändigheten att skapa ett uttag att importera uttagsmodulen. Därefter används metoden socket.socket () för att skapa ett server-uttag.

NOTERA:

AF_INET hänvisar till Adress från Internet och det kräver ett par (värd, port) där värden antingen kan vara en URL till en viss webbplats eller dess adress och portnumret är ett heltal. SOCK_STREAM används för att skapa TCP-protokoll.

Metoden bind () accepterar två parametrar som en tuple (värd, port). Det är dock bättre att använda fyrsiffriga portnummer eftersom de lägre vanligtvis är upptagna. Metoden lyssna () tillåter servern att acceptera anslutningar. Här är 5 kön för flera anslutningar som kommer upp samtidigt. Det minsta värdet som kan anges här är 0 (om du ger ett mindre värde ändras det till 0). Om ingen parameter anges krävs en standard lämplig parameter.

De tillåter att acceptera anslutningar för alltid. 'Clt' och 'adr' är klientobjektet och adressen. Utskriftsutdraget skriver bara ut adressen och portnumret på klientuttaget. Slutligen används clt.send för att skicka data i byte.

Nu när vår server är klar, låt oss gå vidare mot klienten.

Vad är en klient?

En klient är antingen en dator eller programvara som tar emot information eller tjänster från servern. I en klient-server-modul klientförfrågningar om tjänster från servrar. Det bästa exemplet är en webbläsare som Google Chrome, Firefox, etc. Dessa webbläsare begär webbservrar för de nödvändiga webbsidorna och tjänsterna enligt användarens instruktioner. Andra exempel inkluderar onlinespel, onlinechattar etc.

Låt oss nu ta en titt på hur man kodar in klientprogrammet :

EXEMPEL:

importuttag s = uttag.sockel (uttag.AF_INET, uttag.SOCK_STREAM) s.anslutning ((uttag.gethostnamn (), 2346)) msg ​​= s.recv (1024) skriv ut (msg.decode ('utf-8') )

Det första steget är att importera uttagsmodulen och sedan skapa ett uttag precis som du gjorde när du skapade en server. För att skapa en anslutning mellan klientservern måste du använda metoden connect () genom att ange (värd, port).


NOTERA: gethostname används när klient och server är på samma dator. (LAN - localip / WAN - publicip)

Här vill klienten få lite information från servern och för detta måste du använda metoden recv () och informationen lagras i en annan variabel msg. Tänk bara på att informationen som skickas kommer att finnas i byte och att klienten i ovanstående program kan ta emot upp till 1024 byte (buffertstorlek) i en enda överföring. Det kan anges till valfritt belopp beroende på mängden information som överförs.

Slutligen bör meddelandet som överförs avkodas och skrivas ut.

Nu när du är medveten om hur du skapar klient-serverprogram, går vi vidare för att se hur de behöver köras.

Echo Client-Server:

För att utföra dessa program, öppna kommandotolken, gå in i mappen där du har skapat ditt klient- och serverprogram och skriv sedan:

py server.py (här är server.py serverns filnamn, du kan också använda py -3.7 server.py)

När detta är klart börjar servern köra. För att köra klienten, öppna ett annat cmd-fönster och skriv:

c ++ sammanslagningssorteringsalgoritm

py client.py (här är client.py klientens filnamn)

UTGÅNG (SERVER):

(KLIENT)

Låt oss prova samma program genom att minska buffertstorleken till 7 och se vilken effekt vi får:

PRODUKTION:

Som du kan se avslutas anslutningen efter överföring av 7 byte. Men det här är ett problem eftersom du inte har fått fullständig information och anslutningen är stängd. Låt oss fortsätta med att lösa problemet.

Flera kommunikationer:

För att anslutningen ska fortsätta tills klienten får fullständig information kan du använda stundslingan:

EXEMPEL:

importera sockel s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) medan True: msg = s.recv (7) skriva ut (msg.decode ('utf- 8 '))

När du har gjort detta kommer hela meddelandet att tas emot i 7 byte per överföring.

Men den här gången, som du kan se, avslutas inte anslutningen och du vet aldrig när det kommer att hända. Och för att lägga till detta, tänk om du faktiskt inte vet hur stort meddelandet eller informationen som klienten kommer att få från servern. I sådana fall kan du faktiskt använda följande kodkod på klientsidan:

EXEMPEL:

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

På serversidan använder du close () -metoden enligt följande:

clt.close ()

Resultatet av detta kommer att visas som i bilden nedan:

PRODUKTION:



Allt ovanstående kodblock gör är att kontrollera storleken på informationen och skriva ut den i en buffert på två byte åt gången plus att stänga anslutningen när den är klar.

Överföra Python-objekt:

Hittills har du precis fått förmågan att överföra strängar. Men Socket Programmering in Pytonorm låter dig också överföra Python-objekt också. Dessa objekt kan vara vad som helst, set, tuples, ordböcker, etc. För att uppnå detta måste du importera Pythons pickle-modul.

Python-pickle-modul:

Python pickle-modul kommer in i bilden när du faktiskt serialiserar eller avserialiserar objekt i python. Låt oss ta en titt på ett litet exempel,

EXEMPEL:

importera pickle mylist = [1,2, 'abc'] mymsg = pickle.dumps (mylist) skriv ut (mymsg)

PRODUKTION: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ’

Som du kan se, i ovanstående program, 'mylist' serieras med hjälp av dumps () -funktionen för pickle-modulen. Notera också att utgången börjar med ett 'b', vilket betyder att den konverteras till byte. I sockelprogrammering kan du implementera den här modulen för överföring python-objekt mellan klienter och servrar.

Hur använder man pickle-modulen för att överföra python-objektstrukturer?

När du använder pickle tillsammans med uttag kan du absolut överföra vad som helst via nätverket. Låt oss skriva ner serversidan och klientens motsvarigheter för att överföra en lista från servern till klienten:

Serversidan:

importuttag importpipa a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 2133)) # bindande tuple s.listen (5) medan True: clt, adr = s.accept () print (f'Anslutning till {adr} etablerad ') 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)

Här är m en ordbok som i grunden är en som måste skickas från servern till klienten. Detta görs genom att först serieera objektet med hjälp av dumpar () och sedan konvertera det till byte.
Låt oss nu skriva ner motparten på klientsidan:

Klientsidan:

importuttag importpipa a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2133)) medan True: complete_info = b '' rec_msg = True while True: mymsg = s.recv (10) om rec_msg: skriv ut (f'Meddelandets längd = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = Falsk komplett_info + = mymsg om len (komplett_info) -a == x: skriv ut ('Fick fullständig information') skriva ut (komplett_info [a:]) m = pickle.loads (fullständig_info [a:]) utskrift (m) rec_msg = Sann komplett_info = b '' utskrift (komplett_info )

Den första stund-slingan hjälper oss att hålla reda på hela meddelandet (complete_info) samt meddelandet som tas emot (rec_msg) med hjälp av bufferten. meddelandet genom att ställa in rec_
Då medan meddelandet tas emot är allt jag gör att skriva ut varje bit av det, mottas i en buffert av storlek 10. Denna storlek kan vara vad som helst beroende på ditt personliga val.

Sedan, om det mottagna meddelandet är lika med det fullständiga meddelandet, skriver jag bara ut meddelandet som mottaget fullständig info, varefter jag har avserialiserat meddelandet med laddningar ().

Utgången till ovanstående program är som följer:

Detta leder oss till slutet av den här artikeln om Socket Programming i Python. Jag hoppas att du förstod alla begrepp tydligt.

Se till att du tränar så mycket som möjligt och återgår till din upplevelse.

Har du en fråga till oss? Vänligen nämna det i kommentarsektionen i denna 'Socket Programming in Python' -bloggen så kommer vi tillbaka till dig så snart som möjligt.

För att få fördjupad kunskap om Python tillsammans med dess olika applikationer kan du registrera dig för live med 24/7 support och livstidsåtkomst.