Co je Socket Programování v Pythonu a jak jej zvládnout?



Zjistěte, co je programování soketů v Pythonu spolu s komunikací klient-server spolu s přenosem objektů pythonu pomocí nálevu a soketů.

Internet se nepopiratelně stal „duší existence“ a jeho činnost je charakterizována slovy „připojení“ nebo „sítě“. Tyto sítě jsou možné pomocí jednoho z nejdůležitějších základů Zásuvky. Tento článek se zabývá všemi oblastmi zabývajícími se programováním soketů v Pythonu. Zásuvky vám pomohou provést tato připojení to nepochybně usnadňuje.

Pojďme se rychle podívat na všechna témata, na která se vztahuje tento článek:





Proč používat zásuvky?
Co jsou zásuvky v Pythonu?
Jak dosáhnout programování soketů v Pythonu
Co je to server?
Co je klient?
Echo klient-server
Vícenásobná komunikace
Přenos objektů Pythonu



Proč používat zásuvky?

Patice jsou páteří sítě. Umožňují přenos informací mezi dvěma různými programy nebo zařízeními. Když například otevřete prohlížeč, vy jako klient vytváříte připojení k serveru za účelem přenosu informací.

Než se ponoříme hlouběji do této komunikace, pojďme nejprve zjistit, co přesně jsou tyto zásuvky.

Co jsou zásuvky?

Obecně řečeno, sokety jsou vnitřní koncové body vytvořené pro odesílání a přijímání dat. Jedna síť bude mít dvě zásuvky, jednu pro každé komunikující zařízení nebo program. Tyto zásuvky jsou kombinací IP adresy a portu. Jedno zařízení může mít ‚n‘ počet soketů na základě použitého čísla portu. Pro různé typy protokolů jsou k dispozici různé porty. Podívejte se na následující obrázek, kde najdete další informace o některých běžných číslech portů a souvisejících protokolech:




společné porty-SocketProgramminginPython-Edureka

Nyní, když máte jasno v konceptu soketů, pojďme se nyní podívat na Socket modul Pythonu:

Jak dosáhnout programování soketů v Pythonu:

Abyste dosáhli programování soketů v Pythonu, budete muset importovat zásuvka modul nebo . Tento modul se skládá z předdefinovaných metod, které jsou vyžadovány pro vytváření soketů a pomáhají jim přidružovat se navzájem.

Některé z důležitých metod jsou následující:

MetodyPopis

socket.socket ()

slouží k vytvoření soketů (vyžadováno jak pro vytvoření serveru, tak pro klientské konce)

socket.accept ()

slouží k přijetí připojení. Vrátí dvojici hodnot (conn, address), kde conn je nový objekt socket pro odesílání nebo přijímání dat a address je adresa soketu přítomného na druhém konci připojení

socket.bind ()

slouží k vazbě na adresu, která je zadána jako parametr

socket.close ()

slouží k označení zásuvky jako uzavřené

socket.connect ()

slouží k připojení ke vzdálené adrese zadané jako parametr

socket.listen ()

umožňuje serveru přijímat připojení

Nyní, když jste pochopili důležitost zásuvkového modulu, pojďme se podívat, jak může sloužit k vytváření serverů a klientů pro programování soketů v .

Co je to server?

Server je program, počítač nebo zařízení určené ke správě síťových prostředků. Servery mohou být buď na stejném zařízení nebo počítači nebo lokálně připojené k jiným zařízením a počítačům nebo dokonce vzdálené. Existují různé typy serverů, jako jsou databázové servery, síťové servery, tiskové servery atd.

Servery k navázání připojení a navázání na klienty běžně využívají metody jako socket.socket (), socket.bind (), socket.listen () atd. Nyní napíšeme program pro vytvoření serveru. Zvažte následující příklad:

PŘÍKLAD:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) # číslo portu může být cokoli mezi 0-65535 (obvykle specifikujeme nepřekonatelné porty, které jsou > 1023) s.listen (5) while True: clt, adr = s.accept () print (f'Connection to {adr} established ') #f string is literal string prefixed with f which #contains python expressions inside braces clt .send (bytes ('Socket Programming in Python', 'utf-8')) #to send info to clientsocket

Jak vidíte, první nutností vytvoření soketu je import modulu soketu. Poté se metoda socket.socket () použije k vytvoření zásuvky na straně serveru.

POZNÁMKA:

AF_INET odkazuje na adresu z Internetu a vyžaduje dvojici (hostitel, port), kde hostitelem může být buď adresa URL konkrétního webu, nebo jeho adresa a číslo portu je celé číslo. SOCK_STREAM se používá k vytváření protokolů TCP.

měnitelné a neměnné objekty v Javě

Metoda bind () přijímá dva parametry jako řazenou kolekci členů (hostitel, port). Je však lepší použít 4místná čísla portů, protože nižší jsou obvykle obsazena. Metoda listen () umožňuje serveru přijímat připojení. Zde je 5 fronta pro více připojení, která přicházejí současně. Zde lze zadat minimální hodnotu 0 (pokud zadáte nižší hodnotu, změní se na 0). V případě, že není zadán žádný parametr, bude použit výchozí vhodný.

The umožňuje navždy přijímat připojení. „Clt“ a „adr“ jsou klientský objekt a adresa. Tiskový příkaz pouze vytiskne adresu a číslo portu klientského soketu. Nakonec se clt.send používá k odesílání dat v bajtech.

Nyní, když je náš server nastaven, pojďme k klientovi.

Co je klient?

Klientem je počítač nebo software, který přijímá informace nebo služby ze serveru. V modulu klient-server klient požaduje služby ze serverů. Nejlepším příkladem je webový prohlížeč, jako je Google Chrome, Firefox atd. Tyto webové prohlížeče vyžadují webové servery pro požadované webové stránky a služby podle pokynů uživatele. Mezi další příklady patří online hry, online chaty atd.

Pojďme se nyní podívat, jak kódovat program na straně klienta :

PŘÍKLAD:

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

Prvním krokem je import modulu soketu a následné vytvoření soketu, jako jste to udělali při vytváření serveru. Poté, abyste vytvořili spojení mezi klientem a serverem, budete muset použít metodu connect () zadáním (host, port).


POZNÁMKA: gethostname se používá, když jsou klient a server ve stejném počítači. (LAN - localip / WAN - publicip)

Zde chce klient získat nějaké informace ze serveru a pro to musíte použít metodu recv () a informace jsou uloženy v jiné proměnné msg. Mějte na paměti, že předávané informace budou v bajtech a klient ve výše uvedeném programu může přijímat až 1024 bajtů (velikost vyrovnávací paměti) v jednom přenosu. Lze jej zadat na libovolnou částku v závislosti na množství přenášených informací.

Nakonec by měla být přenášená zpráva dekódována a vytištěna.

Nyní, když víte, jak vytvářet programy typu klient-server, pojďme se podívat, jak je třeba je spustit.

Echo klient-server:

Chcete-li tyto programy spustit, otevřete příkazový řádek, přejděte do složky, ve které jste vytvořili klientský a serverový program, a zadejte:

py server.py (zde server.py je název serveru, můžete také použít py -3.7 server.py)

Po dokončení se server spustí. Chcete-li klienta spustit, otevřete další okno cmd a zadejte:

py client.py (zde client.py je název klienta)

VÝSTUP (SERVER):

(KLIENT)

Zkusme stejný program zmenšením velikosti vyrovnávací paměti na 7 a uvidíme, jaký výstup získáme:

VÝSTUP:

Jak vidíte, připojení je ukončeno po přenosu 7 bytů. Jedná se ale o problém, protože jste neobdrželi úplné informace a připojení je ukončeno. Pojďme tento problém vyřešit.

Vícenásobná komunikace:

Aby připojení pokračovalo, dokud klient neobdrží úplné informace, můžete využít smyčku while:

jak najít datový typ v pythonu

PŘÍKLAD:

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

Jakmile to uděláte, obdržíte kompletní zprávu v 7 bajtech na převod.

Jak ale vidíte, tentokrát se spojení neukončí a nikdy nevíte, kdy k němu dojde. A ještě k tomu, co když vlastně nevíte, jak velká je zpráva nebo informace, které klient od serveru obdrží. V takových případech můžete na straně klienta skutečně použít následující bit kódu:

PŘÍKLAD:

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

Na straně serveru použijte metodu close () takto:

clt.close ()

Výstup bude takový, jak je znázorněno na obrázku níže:

VÝSTUP:



Všechny výše uvedené bloky kódu jsou, kontrola velikosti informací a jejich tisk ve vyrovnávací paměti o dvou bajtech současně a ukončení připojení po dokončení.

Přenos objektů Pythonu:

Až dosud máte talent přenášet struny. Ale programování soketů v Krajta také umožňuje přenášet objekty Pythonu. Těmito objekty mohou být cokoli jako množiny, n-tice, slovníky atd. Abyste toho dosáhli, budete muset importovat nakládací modul Pythonu.

Modul pro nakládání v Pythonu:

Modul pro nakládání v Pythonu se objeví, když skutečně serializujete nebo de-serializujete objekty v pythonu. Podívejme se na malý příklad,

PŘÍKLAD:

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

VÝSTUP: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. “

Jak vidíte, ve výše uvedeném programu je ‚mylist 'serializován pomocí funkce dumps () modulu pickle. Všimněte si také, že výstup začíná písmenem „b“, což znamená, že je převeden na bajty. V programování soketů můžete tento modul implementovat k přenosu python objekty mezi klienty a servery.

Jak používat nakládací modul k přenosu struktur objektů pythonu?

Když použijete nálev spolu se zásuvkami, můžete absolutně přenést cokoli přes síť. Zapíšeme si protějšky na straně serveru a na straně klienta, abychom přenesli seznam ze serveru na klienta:

Na straně serveru:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 2133)) #binding n-tice s.listen (5) while True: clt, adr = s.accept () print (f'Connection to {adr} established ') 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)

Zde je m slovník, který je v zásadě a které je třeba odeslat ze serveru klientovi. To se provádí tak, že nejprve serializujete objekt pomocí dumps () a poté jej převedete na bajty.
Nyní si zapíšeme protějšek na straně klienta:

Na straně klienta:

import socket import pickle 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 ('Dostal kompletní informace') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = Pravda Complete_info = b '' print (complete_info )

Smyčka while while nám pomůže sledovat kompletní zprávu (complete_info) i zprávu, která je přijímána (rec_msg) pomocí vyrovnávací paměti. zprávu nastavením rec_
Pak, když je zpráva přijímána, vše, co dělám, je tisknout každý její bit a být přijímán do vyrovnávací paměti velikosti 10. Tato velikost může být cokoli v závislosti na vaší osobní volbě.

Pokud se pak přijatá zpráva rovná úplné zprávě, tisknu zprávu jako přijaté úplné informace, po které jsem de-serializoval zprávu pomocí načtení ().

Výstup do výše uvedeného programu je následující:

Tím se dostáváme na konec tohoto článku o Socket Programming v Pythonu. Doufám, že jste pochopili všechny pojmy jasně.

Ujistěte se, že cvičíte co nejvíce a vraťte své zkušenosti.

Máte na nás dotaz? Uveďte to prosím v sekci komentářů v tomto blogu „Socket Programming in Python“ a my se vám ozveme co nejdříve.

Chcete-li získat podrobné znalosti o Pythonu a jeho různých aplikacích, můžete se zaregistrovat naživo s nepřetržitou podporou a doživotním přístupem.