Hvad er Socket Programming i Python og hvordan man mestrer det?



Lær, hvad der er Socket Programmering i Python sammen med klient-server kommunikation sammen med overførsel af python objekter ved hjælp af pickle og sockets.

Internettet er utvivlsomt blevet 'Soul of Existence', og dets aktivitet er præget af 'Connections' eller 'Networks'. Disse netværk muliggøres ved hjælp af et af de mest afgørende fundamentals Stikkontakter. Denne artikel dækker alle områder, der beskæftiger sig med Socket Programming i Python. Stikkontakter hjælper dig med at oprette disse forbindelser, mens gør det utvivlsomt let.

Lad os se hurtigt på alle de emner, der er dækket af denne artikel:





Hvorfor bruge stikkontakter?
Hvad er stikkontakter i Python?
Sådan opnås Socket-programmering i Python
Hvad er en server?
Hvad er en klient?
Echo Client-Server
Flere kommunikationer
Overførsel af Python-objekter



Hvorfor bruge stikkontakter?

Stikkontakter er rygraden i netværk. De muliggør overførsel af information mellem to forskellige programmer eller enheder. For eksempel, når du åbner din browser, opretter du som klient en forbindelse til serveren til overførsel af information.

Før vi dykker dybere ned i denne kommunikation, skal vi først finde ud af, hvad der er disse stik.

Hvad er stikkontakter?

Generelt er stikkontakter indvendige slutpunkter bygget til afsendelse og modtagelse af data. Et enkelt netværk vil have to sokler, en til hver kommunikationsenhed eller hvert kommunikationsprogram. Disse stikkontakter er en kombination af en IP-adresse og en port. En enkelt enhed kan have 'n' antal sokler baseret på det portnummer, der bruges. Forskellige porte er tilgængelige for forskellige typer protokoller. Se på det følgende billede for at få mere at vide om nogle af de almindelige portnumre og de relaterede protokoller:




fælles porte-SocketProgramminginPython-Edureka

Nu hvor du er klar over begrebet stikkontakter, lad os nu se på Socket-modulet i Python:

Sådan opnås Socket-programmering i Python:

For at opnå Socket-programmering i Python skal du importere stikkontakt modul eller . Dette modul består af indbyggede metoder, der er nødvendige for at oprette stikkontakter og hjælpe dem med at omgås hinanden.

Nogle af de vigtige metoder er som følger:

MetoderBeskrivelse

stikkontakt.stik ()

bruges til at oprette stikkontakter (kræves på både server såvel som klientender for at oprette stikkontakter)

socket.accept ()

bruges til at acceptere en forbindelse. Det returnerer et par værdier (tilslutning, adresse), hvor tilslutning er et nyt stikkontaktobjekt til afsendelse eller modtagelse af data, og adresse er adressen på stikkontakten til stede i den anden ende af forbindelsen

socket.bind ()

bruges til at binde til den adresse, der er angivet som en parameter

socket.close ()

bruges til at markere stikket som lukket

stikkontakt.forbinde ()

bruges til at oprette forbindelse til en fjernadresse, der er angivet som parameter

socket.listen ()

gør det muligt for serveren at acceptere forbindelser

Nu hvor du har forstået vigtigheden af ​​sokkelmodul, lad os gå videre for at se, hvordan det kan tjene til at oprette servere og klienter til Socket-programmering i .

Hvad er en server?

En server er enten et program, en computer eller en enhed, der er afsat til styring af netværksressourcer. Servere kan enten være på samme enhed eller computer eller lokalt forbundet til andre enheder og computere eller endda fjernbetjening. Der findes forskellige typer servere såsom databaseservere, netværksservere, printerservere osv.

Servere bruger ofte metoder som socket.socket (), socket.bind (), socket.listen () osv. For at oprette en forbindelse og binde til klienterne. Lad os nu skrive et program for at oprette en server. Overvej følgende eksempel:

EKSEMPEL:

hvis udsagn i SQL-forespørgsler
importstik s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) #portnummer kan være alt mellem 0-65535 (vi angiver normalt ikke-privilegerede porte, der er > 1023) s.listen (5) mens True: clt, adr = s.accept () print (f'Forbindelse til {adr} etableret ') #f streng er bogstavelig streng præfikset med f som # indeholder pythonudtryk inden i seler clt .send (bytes ('Socket Programming in Python', 'utf-8')) # for at sende info til clientsocket

Som du kan se, er den første nødvendighed at oprette en sokkel at importere sokkelmodulet. Derefter bruges metoden socket.socket () til at oprette en server-side-sokkel.

BEMÆRK:

AF_INET henviser til adresse fra internettet, og det kræver et par (vært, port), hvor værten enten kan være en URL til et bestemt websted eller dets adresse, og portnummeret er et heltal. SOCK_STREAM bruges til at oprette TCP-protokoller.

Metoden bind () accepterer to parametre som en tuple (vært, port). Det er dog bedre at bruge 4-cifrede portnumre, da de nederste normalt er optaget. Metoden listen () giver serveren mulighed for at acceptere forbindelser. Her er 5 køen til flere forbindelser, der kommer op samtidigt. Den mindste værdi, der kan angives her, er 0 (hvis du angiver en mindre værdi, ændres den til 0). Hvis der ikke er angivet nogen parameter, kræver det en standard egnet parameter.

Det tillader accept af forbindelser for evigt. 'Clt' og 'adr' er klientobjektet og adressen. Udskriftserklæringen udskriver bare adressen og portnummeret på klientstikket. Endelig bruges clt.send til at sende dataene i bytes.

Nu hvor vores server er klar, lad os gå videre mod klienten.

Hvad er en klient?

En klient er enten en computer eller software, der modtager information eller tjenester fra serveren. I et klient-server-modul klienter anmodninger om tjenester fra servere. Det bedste eksempel er en webbrowser som Google Chrome, Firefox osv. Disse webbrowsere anmoder webservere om de krævede websider og tjenester som anvist af brugeren. Andre eksempler inkluderer onlinespil, onlinechats osv.

Lad os nu se på, hvordan man koder programmet på klientsiden :

EKSEMPEL:

import stikkontakt s = stikkontakt (stikkontakt.AF_INET, stikkontakt.SOCK_STREAM) s.forbindelse ((stikkontakt.gethostnavn (), 2346) msg ​​= s.recv (1024) udskriv (msg.decode ('utf-8') )

Det første trin er at importere sokkelmodulet og derefter oprette en sokkel ligesom du gjorde, mens du oprettede en server. For at oprette en forbindelse mellem klientserveren skal du derefter bruge metoden connect () ved at angive (vært, port).


BEMÆRK: gethostname bruges, når klient og server er på den samme computer. (LAN - localip / WAN - publicip)

Her ønsker klienten at modtage nogle oplysninger fra serveren, og til dette skal du bruge metoden recv (), og oplysningerne gemmes i en anden variabel msg. Bare husk, at den information, der sendes, findes i byte, og at klienten i ovenstående program kan modtage op til 1024 byte (bufferstørrelse) i en enkelt overførsel. Det kan specificeres til ethvert beløb afhængigt af mængden af ​​information, der overføres.

hvordan man indstiller sti i java

Endelig skal beskeden, der overføres, afkodes og udskrives.

Nu hvor du er opmærksom på, hvordan du opretter klient-serverprogrammer, skal vi gå videre for at se, hvordan de skal udføres.

Echo Client-Server:

For at udføre disse programmer skal du åbne din kommandoprompt, komme ind i mappen, hvor du har oprettet dit klient- og serverprogram, og skriv derefter:

py server.py (her er server.py servernavnet, du kan også bruge py -3.7 server.py)

Når dette er gjort, begynder serveren at køre. For at udføre klienten skal du åbne et andet cmd-vindue og skrive:

py client.py (her er client.py klientens filnavn)

UDGANG (SERVER):

(KLIENT)

Lad os prøve det samme program ved at reducere bufferstørrelsen til 7 og se, hvilket output vi får:

PRODUKTION:

forekomst af en klasse java

Som du kan se, afbrydes forbindelsen efter overførsel af 7 byte. Men dette er et problem, fordi du ikke har modtaget de komplette oplysninger, og forbindelsen er lukket. Lad os fortsætte med at løse dette problem.

Flere kommunikationer:

For at forbindelsen kan fortsætte, indtil klienten modtager de komplette oplysninger, kan du gøre brug af while-sløjfen:

EKSEMPEL:

importstik s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) mens True: msg = s.recv (7) print (msg.decode ('utf- 8 '))

Når du har gjort dette, modtages den komplette besked i 7 byte pr. Overførsel.

Men denne gang, som du kan se, afbrydes forbindelsen ikke, og du ved aldrig, hvornår det skal ske. Og for at tilføje dette, hvad hvis du faktisk ikke ved, hvor stor er den besked eller information, som klienten modtager fra serveren. I sådanne tilfælde kan du faktisk bruge følgende bit 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 skal du bruge metoden close () som følger:

clt.close ()

Outputtet af dette vil være som vist på billedet nedenfor:

PRODUKTION:



Alt ovenstående kodeblok gør er at kontrollere størrelsen på informationen og udskrive den i en buffer på to byte ad gangen plus lukke forbindelsen, når den er afsluttet.

Overførsel af Python-objekter:

Indtil her har du lige fået evnen til at overføre strenge. Men, Socket Programmering i Python giver dig også mulighed for at overføre Python-objekter også. Disse objekter kan være alt som sæt, tupler, ordbøger osv. For at opnå dette skal du importere pickle-modulet af Python.

Python pickle-modul:

Python-pickle-modul kommer ind i billedet, når du faktisk serialiserer eller afserialiserer objekter i python. Lad os se på et lille eksempel,

EKSEMPEL:

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

PRODUKTION: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ’

Som du kan se, i ovenstående program, er 'mylist' serialiseret ved hjælp af dumps () -funktionen i pickle-modulet. Skriv også en bemærkning om, at output starter med et 'b', hvilket betyder at det er konverteret til byte. I socket-programmering kan du implementere dette modul til overførsel python-objekter mellem klienter og servere.

Hvordan bruges pickle-modulet til at overføre python-objektstrukturer?

Når du bruger pickle sammen med stikkontakter, kan du absolut overføre alt gennem netværket. Lad os nedskrive serversiden og klientsiden for at 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 () print (f'Tilslutning til {adr} oprettet ') m = {1:' Client ', 2:' Server '} mymsg = pickle.dumps (m) #the msg vi ønsker at udskrive senere mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

Her er m en ordbog, der grundlæggende er en der skal sendes fra serveren til klienten. Dette gøres ved først at serialisere objektet ved hjælp af dumps () og derefter konvertere det til bytes.
Lad os nu nedskrive klientens modstykke:

Kundeside:

import stikkontakt 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 while True: mymsg = s.recv (10) hvis rec_msg: print (f'Længden af ​​meddelelsen = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = Falsk komplet_info + = mymsg hvis len (komplet_info) -a == x: print ('Modtaget den komplette info') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b '' print (complete_info )

Den første while-loop hjælper os med at holde styr på den komplette meddelelse (complete_info) samt den besked, der modtages (rec_msg) ved hjælp af bufferen. meddelelsen ved at indstille rec_
Derefter, mens meddelelsen modtages, er alt, hvad jeg laver, at udskrive hver bit af den og blive modtaget i en buffer i størrelse 10. Denne størrelse kan være alt afhængigt af dit personlige valg.

Derefter, hvis den modtagne besked er lig med den komplette besked, udskriver jeg bare beskeden som modtaget komplet info, hvorefter jeg har de-serialiseret beskeden ved hjælp af belastninger ().

Output til ovenstående program er som følger:

Dette bringer os til slutningen af ​​denne artikel om Socket Programming i Python. Jeg håber, du forstod alle begreberne tydeligt.

Sørg for at øve så meget som muligt, og vend din oplevelse tilbage.

Har du et spørgsmål til os? Nævn det i kommentarfeltet på denne “Socket Programming in Python” -blog, og vi vender tilbage til dig hurtigst muligt.

For at få dybtgående viden om Python sammen med dens forskellige applikationer kan du tilmelde dig live med 24/7 support og levetid adgang.