Wat is socketprogrammering in Python en hoe beheer je het?



Ontdek wat Socket Programming in Python is, samen met client-servercommunicatie, samen met het overbrengen van Python-objecten met behulp van augurk en sockets.

Het internet is ontegensprekelijk de ‘Soul of Existence’ geworden en zijn activiteit wordt gekenmerkt door ‘Connections’ of ‘Networks’. Deze netwerken worden mogelijk gemaakt met behulp van een van de meest cruciale basisprincipes van Stopcontacten. Dit artikel behandelt alle gebieden die te maken hebben met Socket Programming in Python. Sockets helpen u bij het maken van deze verbindingen, terwijl maakt het ongetwijfeld gemakkelijk.

Laten we eens kijken naar alle onderwerpen die in dit artikel worden behandeld:





Waarom stopcontacten gebruiken?
Wat zijn stopcontacten in Python?
Hoe Socket Programming in Python te bereiken
Wat is een server?
Wat is een klant?
Echo Client-Server
Meerdere communicatie
Python-objecten overbrengen



Waarom stopcontacten gebruiken?

Sockets vormen de ruggengraat van netwerken. Ze maken de overdracht van informatie mogelijk tussen twee verschillende programma's of apparaten. Wanneer u bijvoorbeeld uw browser opent, maakt u als klant een verbinding met de server voor de overdracht van informatie.

Voordat we dieper in deze communicatie duiken, moeten we eerst uitzoeken wat deze stopcontacten precies zijn.

Wat zijn stopcontacten?

In het algemeen zijn sockets interne eindpunten die zijn gebouwd voor het verzenden en ontvangen van gegevens. Een enkel netwerk heeft twee stopcontacten, één voor elk communicerend apparaat of programma. Deze sockets zijn een combinatie van een IP-adres en een poort. Een enkel apparaat kan een ‘n’ aantal sockets hebben op basis van het poortnummer dat wordt gebruikt. Er zijn verschillende poorten beschikbaar voor verschillende soorten protocollen. Bekijk de volgende afbeelding voor meer informatie over enkele veelgebruikte poortnummers en de gerelateerde protocollen:




gemeenschappelijke poorten-SocketProgramminginPython-Edureka

Nu je duidelijk bent over het concept van sockets, laten we nu eens kijken naar de Socket-module van Python:

Hoe Socket Programming in Python te bereiken:

Om Socket Programming in Python te bereiken, moet je het stopcontact module of . Deze module bestaat uit ingebouwde methoden die nodig zijn om sockets te maken en hen te helpen met elkaar te associëren.

Enkele van de belangrijkste methoden zijn:

MethodenOmschrijving

socket.socket ()

gebruikt om sockets te maken (vereist op zowel server- als clientuiteinden om sockets te maken)

socket.accept ()

gebruikt om een ​​verbinding te accepteren. Het retourneert een paar waarden (conn, adres) waarbij conn een nieuw socketobject is voor het verzenden of ontvangen van gegevens en adres het adres is van de socket die aanwezig is aan het andere uiteinde van de verbinding

socket.bind ()

gebruikt om te binden aan het adres dat is opgegeven als parameter

socket.close ()

hoe je een reeks objecten in java maakt
gebruikt om het stopcontact als gesloten te markeren

socket.connect ()

wordt gebruikt om verbinding te maken met een extern adres dat is opgegeven als de parameter

socket.listen ()

stelt de server in staat om verbindingen te accepteren

Nu u het belang van socketmodule hebt begrepen, gaan we verder kijken hoe het kan dienen om servers en clients te maken voor socketprogrammering in .

Wat is een server?

Een server is een programma, een computer of een apparaat dat is bedoeld voor het beheer van netwerkbronnen. Servers kunnen zich op hetzelfde apparaat of dezelfde computer bevinden of lokaal zijn verbonden met andere apparaten en computers of zelfs op afstand. Er zijn verschillende soorten servers zoals databaseservers, netwerkservers, printservers, enz.

Servers maken gewoonlijk gebruik van methoden zoals socket.socket (), socket.bind (), socket.listen (), enz. Om een ​​verbinding tot stand te brengen en te binden aan de clients. Laten we nu een programma schrijven om een ​​server te maken. Beschouw het volgende voorbeeld:

VOORBEELD:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) #poortnummer kan alles zijn tussen 0-65535 (we specificeren meestal niet-gebruikte poorten die > 1023) s.listen (5) while True: clt, adr = s.accept () print (f'Verbinding met {adr} gevestigd ') #f string is een letterlijke string met voorvoegsel f die # bevat python-expressies tussen accolades clt .send (bytes ('Socket Programming in Python', 'utf-8')) #om info naar clientsocket te sturen

Zoals u kunt zien, is de eerste noodzaak om een ​​socket te maken, het importeren van de socketmodule. Daarna wordt de methode socket.socket () gebruikt om een ​​server-side socket te maken.

OPMERKING:

AF_INET verwijst naar Adres van internet en vereist een paar (host, poort) waarbij de host een URL van een bepaalde website of het adres kan zijn en het poortnummer een geheel getal is. SOCK_STREAM wordt gebruikt om TCP-protocollen te creëren.

De bind () -methode accepteert twee parameters als een tuple (host, poort). Het is echter beter om 4-cijferige poortnummers te gebruiken, aangezien de laagste meestal bezet zijn. Met de methode listen () kan de server verbindingen accepteren. Hier is 5 de wachtrij voor meerdere verbindingen die tegelijkertijd verschijnen. De minimumwaarde die hier kan worden opgegeven, is 0 (als u een lagere waarde opgeeft, wordt deze gewijzigd in 0). Als er geen parameter is opgegeven, is er een standaard geschikte parameter nodig.

De staat het voor altijd accepteren van verbindingen toe. ‘Clt’ en ‘adr’ zijn het object en adres van de klant. De printinstructie drukt alleen het adres en het poortnummer van de client-socket af. Ten slotte wordt clt.send gebruikt om de gegevens in bytes te verzenden.

Nu onze server helemaal klaar is, gaan we verder naar de client.

hoe het programma in java te beëindigen

Wat is een klant?

Een client is een computer of software die informatie of services van de server ontvangt. In een client-server-module vragen clients om services van servers. Het beste voorbeeld is een webbrowser zoals Google Chrome, Firefox, etc. Deze webbrowsers vragen webservers voor de vereiste webpagina's en services zoals aangegeven door de gebruiker. Andere voorbeelden zijn online games, online chats, enz.

Laten we nu eens kijken hoe we het client-side programma kunnen coderen :

VOORBEELD:

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

De eerste stap is om de socketmodule te importeren en vervolgens een socket te maken, net zoals u deed bij het maken van een server. Om vervolgens een verbinding tussen de client-server tot stand te brengen, moet u de methode connect () gebruiken door (host, poort) op te geven.


OPMERKING: gethostname wordt gebruikt als client en server op dezelfde computer staan. (LAN - localip / WAN - publicip)

Hier wil de client wat informatie van de server ontvangen en hiervoor moet je de recv () methode gebruiken en de informatie wordt opgeslagen in een andere variabele msg. Houd er rekening mee dat de informatie die wordt doorgegeven in bytes zal zijn en dat de client in het bovenstaande programma tot 1024 bytes (buffergrootte) kan ontvangen in een enkele overdracht. Het kan worden gespecificeerd tot elk bedrag, afhankelijk van de hoeveelheid informatie die wordt overgedragen.

Ten slotte moet het bericht dat wordt verzonden, worden gedecodeerd en afgedrukt.

Nu u weet hoe u client-serverprogramma's moet maken, gaan we verder om te zien hoe ze moeten worden uitgevoerd.

Echo Client-Server:

Om deze programma's uit te voeren, opent u uw opdrachtprompt, gaat u naar de map waarin u uw client- en serverprogramma hebt gemaakt en typt u:

py server.py (hier is server.py de bestandsnaam van de server, je kunt ook py -3.7 server.py gebruiken)

Zodra dit is gebeurd, begint de server te draaien. Om de client uit te voeren, opent u een ander cmd-venster en typt u:

py client.py (hier is client.py de bestandsnaam van de client)

UITGANG (SERVER):

(CLIËNT)

Laten we hetzelfde programma proberen door de buffergrootte te verkleinen tot 7 en kijken welke output we krijgen:

UITGANG:

instantie van een klasse java

Zoals u kunt zien, wordt de verbinding verbroken na het overbrengen van 7 bytes. Maar dit is een probleem omdat u niet de volledige informatie heeft ontvangen en de verbinding is verbroken. Laten we dit probleem gaan oplossen.

Meerdere communicatie:

Om de verbinding door te laten gaan totdat de client de volledige informatie heeft ontvangen, kunt u gebruik maken van de while-lus:

VOORBEELD:

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

Zodra u dit doet, wordt het volledige bericht ontvangen in 7 bytes per overdracht.

Maar zoals je kunt zien, wordt de verbinding deze keer niet verbroken en weet je nooit wanneer het gaat gebeuren. En om hieraan toe te voegen, wat als u eigenlijk niet weet hoe groot het bericht of de informatie is die de client van de server zal ontvangen? In dergelijke gevallen kunt u het volgende stukje code aan de clientzijde gebruiken:

VOORBEELD:

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

Gebruik aan de serverzijde de methode close () als volgt:

clt.close ()

De output hiervan is zoals weergegeven in de onderstaande afbeelding:

UITGANG:



Het bovenstaande codeblok controleert alleen de grootte van de informatie en drukt deze af in een buffer van twee bytes tegelijk, plus het sluiten van de verbinding nadat deze is voltooid.

Python-objecten overbrengen:

Tot hier heb je de vaardigheid om snaren over te zetten. Maar Socket Programming in Python stelt je ook in staat om Python-objecten over te dragen. Deze objecten kunnen van alles zijn, zoals sets, tuples, woordenboeken, enz. Om dit te bereiken, moet je de pickle-module van Python importeren.

Python augurk module:

Python-pickle-module komt in beeld wanneer u objecten in python daadwerkelijk serialiseert of de-serialiseert. Laten we een klein voorbeeld bekijken,

VOORBEELD:

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

UITGANG: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ’

Zoals je kunt zien, wordt in het bovenstaande programma ‘mijnlijst’ geserialiseerd met behulp van de functie dumps () van de pickle-module. Merk ook op dat de uitvoer begint met een ‘b’, wat betekent dat het wordt geconverteerd naar bytes. Bij socketprogrammering kunt u deze module implementeren om over te dragen python-objecten tussen clients en servers.

Hoe gebruik je de pickle-module om python-objectstructuren over te dragen?

Wanneer u augurk samen met sockets gebruikt, kunt u absoluut alles via het netwerk overbrengen. Laten we de server-side en client-side tegenhangers opschrijven om een ​​lijst van de server naar de client over te brengen:

Serverzijde:

socket importeren pickle importeren 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'Connection to {adr} gevestigd ') m = {1:' Client ', 2:' Server '} mymsg = pickle.dumps (m) #het bericht dat we later willen afdrukken mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

Hier is m een ​​woordenboek dat in feite een dat moet worden verzonden van de server naar de client. Dit wordt gedaan door het object eerst te serialiseren met dumps () en het vervolgens naar bytes te converteren.
Laten we nu de tegenhanger aan de clientzijde opschrijven:

Kant van de cliënt:

socket importeren pickle importeren 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'The length of message = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = False complete_info + = mymsg if len (complete_info) -a == x: print ('De volledige info ontvangen') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b '' print (complete_info )

De eerste while-lus helpt ons het volledige bericht (complete_info) bij te houden, evenals het bericht dat wordt ontvangen (rec_msg) met behulp van de buffer. het bericht door rec_ in te stellen
Vervolgens, terwijl het bericht wordt ontvangen, is alles wat ik doe het afdrukken van elk stukje ervan, dat wordt ontvangen in een buffer van grootte 10. Deze grootte kan van alles zijn, afhankelijk van uw persoonlijke keuze.

Als het ontvangen bericht gelijk is aan het volledige bericht, druk ik het bericht gewoon af als de volledige informatie die ik heb ontvangen, waarna ik het bericht heb gedeserialiseerd met behulp van load ().

De uitvoer naar het bovenstaande programma is als volgt:

Dit brengt ons bij het einde van dit artikel over socketprogrammering in Python. Ik hoop dat je alle concepten duidelijk hebt begrepen.

Zorg ervoor dat je zoveel mogelijk oefent en terugkeert naar je ervaring.

Heeft u een vraag voor ons? Vermeld het in het commentaargedeelte van deze 'Socket Programming in Python' blog en we nemen zo snel mogelijk contact met je op.

Om diepgaande kennis op te doen over Python en de verschillende applicaties, kunt u zich live inschrijven met 24/7 ondersteuning en levenslange toegang.