Mi az a Socket programozás a Pythonban, és hogyan lehet elsajátítani?



Ismerje meg, mi a Socket programozás a Python-ban, valamint az ügyfél-kiszolgáló kommunikáció, valamint a python objektumok átvétele a savanyúság és a foglalatok segítségével.

Az internet tagadhatatlanul a „lét lélekévé” vált, és tevékenységét „kapcsolatok” vagy „hálózatok” jellemzik. Ezeket a hálózatokat az egyik legfontosabb elem felhasználásával teszik lehetővé Aljzatok. Ez a cikk a Socket programozással foglalkozik a Pythonban. Az aljzatok segítenek ezeknek a kapcsolatoknak a létrehozásában , kétségtelenül megkönnyíti.

Vessünk egy gyors pillantást a cikkben tárgyalt összes témára:





Miért érdemes használni a Sockets szolgáltatást?
Mik a socketek a Pythonban?
Hogyan érhető el a Socket programozás a Pythonban
Mi az a szerver?
Mi az ügyfél?
Echo Client-Server
Többszörös kommunikáció
Python objektumok átvitele

kivétel kezelése pl sql-ben



Miért érdemes használni a Sockets szolgáltatást?

Az aljzatok jelentik a hálózat gerincét. Lehetővé teszik az információk átadását két különböző program vagy eszköz között. Például, amikor megnyitja a böngészőt, akkor mint ügyfél létrehozza a kapcsolatot a kiszolgálóval az információk átadásához.

Mielőtt mélyebben belemerülne ebbe a kommunikációba, először derítsük ki, melyek is ezek a foglalatok.

Mik a Sockets?

Általánosságban a foglalatok belső végpontok, amelyek az adatok küldésére és fogadására épülnek. Egyetlen hálózat két aljzattal rendelkezik, egyet minden kommunikációs eszközhöz vagy programhoz. Ezek a foglalatok egy IP-cím és egy Port kombinációját alkotják. Egyetlen eszköznek „n” számú foglalata lehet a használt portszám alapján. Különböző portok állnak rendelkezésre a különböző típusú protokollokhoz. Tekintse meg a következő képet, hogy többet megtudjon néhány általános portszámról és a kapcsolódó protokollokról:




common ports-SocketProgramminginPython-Edureka

Most, hogy tisztában van a socketek fogalmával, most nézzük meg a Python Socket modulját:

Hogyan érhető el a Socket programozás a Pythonban:

A Socket programozás Pythonban való eléréséhez importálnia kell a foglalat modul vagy . Ez a modul beépített módszerekből áll, amelyekre szükség van a foglalatok létrehozásához, és segítik őket a társulásban.

Néhány fontos módszer a következő:

MódLeírás

socket.socket ()

socketek létrehozásához használt (mind a szerveren, mind az ügyfélvégeken szükséges a socketek létrehozásához)

socket.accept ()

a kapcsolat elfogadásához használt. Visszaad egy pár értéket (conn, address), ahol a conn egy új socket objektum az adatok küldéséhez vagy fogadásához, a address pedig a kapcsolat másik végén található socket címe.

socket.bind ()

a paraméterként megadott címhez való kapcsolódáshoz használatos

socket.close ()

az aljzat zártként való megjelölésére szolgál

socket.connect ()

paraméterként megadott távoli címhez való csatlakozáshoz használatos

socket.listen ()

lehetővé teszi a szervernek a kapcsolatok elfogadását

Most, hogy megértette a socket modul fontosságát, folytassuk, nézzük meg, hogyan szolgálhat szerverek és kliensek létrehozására a Socket programozáshoz .

Mi az a szerver?

A szerver program, számítógép vagy eszköz, amelyet a hálózati erőforrások kezelésére fordítanak. A szerverek lehetnek ugyanazon az eszközön vagy számítógépen, vagy helyileg kapcsolódhatnak más eszközökhöz és számítógépekhez, vagy akár távoli is. Különböző típusú szerverek léteznek, például adatbázis-kiszolgálók, hálózati szerverek, nyomtatószerverek stb.

A szerverek általában olyan módszereket használnak, mint a socket.socket (), socket.bind (), socket.listen () stb., Hogy kapcsolatot létesítsenek és kapcsolódjanak az ügyfelekhez. Most írjunk egy programot egy szerver létrehozására. Tekintsük a következő példát:

PÉLDA:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) #port szám bármi lehet 0-65535 között (általában nem elõnyös portokat adunk meg, amelyek: > 1023) s.listen (5), míg True: clt, adr = s.accept () print (f'Connection to {adr} found ') #f string egy szó szerinti karakterlánc, amely előtaggal f, amely # tartalmaz python kifejezéseket zárójelben clt .send (bytes ('Socket programozás a Pythonban', 'utf-8')) # információ elküldéséhez a clientockhoz

Amint láthatja, a socket létrehozásának elsődleges szükségessége a socket modul importálása. Ezt követően a socket.socket () metódust használják a szerveroldali socket létrehozására.

JEGYZET:

Az AF_INET az Internetről címre utal, és ehhez pár (host, port) szükséges, ahol a gazdagép lehet egy adott webhely URL-je vagy címe, és a portszám egész szám. A SOCK_STREAM a TCP protokollok létrehozására szolgál.

A bind () metódus két paramétert fogad el duplaként (gazdagép, port). Jobb azonban négyjegyű portszámokat használni, mivel az alacsonyabbak általában foglaltak. A listen () metódus lehetővé teszi a szerver számára a kapcsolatok elfogadását. Itt az 5 az egyidejűleg felmerülő több kapcsolat sora. Az itt megadható minimális érték 0 (ha kisebb értéket ad meg, az 0-ra változik). Abban az esetben, ha nincs megadva paraméter, az alapértelmezetten megfelelőt vesz igénybe.

Az örökre lehetővé teszi a kapcsolatok elfogadását. A „clt” és az „adr” az ügyfél objektuma és címe. A nyomtatott utasítás csak kiírja az ügyfélaljzat címét és portszámát. Végül a clt.send segítségével bájtban küldjük az adatokat.

Most, hogy a szerverünk készen áll, lépjünk tovább az ügyfél felé.

Mi az ügyfél?

Az ügyfél olyan számítógép vagy szoftver, amely információkat vagy szolgáltatásokat fogad a szervertől. Az ügyfél-kiszolgáló modulban az ügyfelek szolgáltatásokat kérnek a kiszolgálóktól. A legjobb példa egy webböngésző, például a Google Chrome, a Firefox stb. Ezek a webböngészők webszervereket kérnek a szükséges weboldalakhoz és szolgáltatásokhoz a felhasználó utasítása szerint. További példák: online játékok, online csevegések stb.

Most nézzük meg, hogyan kell kódolni az ügyféloldali programot :

PÉLDA:

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

Az első lépés az, hogy importálja a socket modult, majd hozzon létre egy socketet, ugyanúgy, mint egy szerver létrehozása során. Ezután a kliens-kiszolgáló közötti kapcsolat létrehozásához a connect () metódust kell használnia a (host, port) megadásával.


JEGYZET: A gethostname akkor használható, ha az ügyfél és a kiszolgáló ugyanazon a számítógépen van. (LAN - localip / WAN - publicip)

Itt az ügyfél bizonyos információkat szeretne kapni a szervertől, és ehhez a recv () metódust kell használnia, és az információkat egy másik változó msg-ban tárolja. Csak ne feledje, hogy az átadott információ bájtokban lesz, és a fenti program kliensében akár 1024 bájt (pufferméret) is fogadható egyetlen átadással. Bármely mennyiségre megadható, az átadott információ mennyiségétől függően.

Végül az átvitt üzenetet dekódolni és kinyomtatni kell.

Most, hogy tisztában van azzal, hogyan hozhat létre kliens-szerver programokat, lépjünk tovább, hogy lássuk, miként kell végrehajtani őket.

Echo kliens-kiszolgáló:

Ezeknek a programoknak a végrehajtásához nyissa meg a parancssort, lépjen be abba a mappába, ahol létrehozta az ügyfél- és kiszolgálóprogramot, majd írja be:

py server.py (itt a server.py a kiszolgáló fájlneve, használhatja a py -3.7 server.py alkalmazást is)

Ha ez megtörtént, a szerver elkezd futni. Az ügyfél végrehajtásához nyisson meg egy másik cmd ablakot, és írja be:

py client.py (itt az client.py az ügyfél fájlneve)

KIMENET (SZERVER):

(ÜGYFÉL)

Próbáljuk meg ugyanazt a programot úgy, hogy a puffer méretét 7-re csökkentjük, és nézzük meg, milyen kimenetet kapunk:

KIMENET:

Mint látható, a kapcsolat megszakad 7 bájt átvitele után. De ez azért kérdés, mert nem kapta meg a teljes információt, és a kapcsolat megszakadt. Folytassuk a kérdés megoldását.

Több kommunikáció:

Ha a kapcsolat addig tart, amíg az ügyfél meg nem kapja a teljes információt, használhatja a while ciklust:

PÉLDA:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)), míg True: msg = s.recv (7) print (msg.decode ('utf- 8 '))

Miután ezt megtette, a teljes üzenet átvitelenként 7 bájtban érkezik.

De ezúttal, mint láthatja, a kapcsolat nem szűnik meg, és soha nem lehet tudni, hogy mikor fog bekövetkezni. És ehhez hozzá kell tenni, mi van akkor, ha valójában nem tudja, mekkora az az üzenet vagy információ, amelyet az ügyfél a szervertől kap. Ilyen esetekben valóban a következő bit kódot használhatja az ügyfél oldalon:

PÉLDA:

complete_info = '', míg True: msg = s.recv (7), ha len (msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

A kiszolgáló oldalán használja a close () metódust az alábbiak szerint:

clt.close ()

Ennek kimenete az alábbi képen látható lesz:

KIMENET:



A fenti kódblokk csak annyit tesz, hogy ellenőrzi az információk méretét és egyenként két bájtos pufferbe nyomtatja, valamint lezárja a kapcsolatot, miután befejeződött.

Python objektumok átvitele:

Idáig csak megszerezte a húrok átadásának ügyességét. De, Socket programozás Piton lehetővé teszi a Python-objektumok átvitelét is. Ezek az objektumok bármi lehet, mint halmazok, tömbök, szótárak stb. Ennek eléréséhez importálni kell a Python savanyúság modulját.

Python savanyúság modul:

A Python savanyú modul akkor jelenik meg a képen, amikor az objektumokat ténylegesen sorosítja vagy eltávolítja a sorozatot a pythonban. Nézzünk meg egy kis példát,

PÉLDA:

savanyúságlista importálása = [1,2, 'abc'] mymsg = savanyúság.dumps (mylist) nyomtatás (mymsg)

KIMENET: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ”

Amint láthatja, a fenti programban a „mylist” sorba kerül a savanyú modul dumps () függvényével. Azt is jegyezze meg, hogy a kimenet „b” betűvel kezdődik, vagyis bájtokká konvertálódik. A socket programozásban megvalósíthatja ezt a modult az átvitelhez python objektumok kliensek és szerverek között.

Hogyan használjuk a savanyú modult a python objektumszerkezetek átadásához?

Ha a savanyúságot foglalatokkal együtt használja, akkor mindent bármit átvihet a hálózaton keresztül. Írjuk le a kiszolgálói és az ügyféloldali partnereket, hogy a listát a szerverről az ügyfélre továbbítsák:

javascript riasztás bejelentkezés a letöltéshez

Szerver oldal:

import socket import savanyúság a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 2133)) #binding tuple s.listen (5), míg True: clt, adr = s.accept () print (f'Csatlakozás a (z) {adr} -hez létrejött) m = {1: 'Ügyfél', 2: 'Szerver'} mymsg = pickle.dumps (m) #a későbbi mymsg-t szeretnénk kinyomtatni = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

Itt m egy szótár, amely alapvetően a amelyet el kell küldeni a szerverről az ügyfélnek. Ez úgy történik, hogy először az objektumot sorosítja a dumps () segítségével, majd átalakítja bájtokká.
Most írjuk le az ügyféloldali megfelelőt:

Ügyfél oldal:

import socket import savanyúság a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2133)), míg True: complete_info = b '' rec_msg = True míg True: mymsg = s.recv (10), ha rec_msg: print (f'Az üzenet hossza = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = Hamis teljes_info + = mymsg, ha len (teljes_info) -a == x: print ('A teljes információt megkapta') print (complete_info [a:]) m = pácolás.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b '' print (teljes_info )

Az első while ciklus segít nyomon követni a teljes üzenetet (complete_info), valamint a puffer segítségével kapott üzenetet (rec_msg). az üzenet a rec_ beállításával
Aztán amíg az üzenet beérkezik, csak annyit teszek, hogy kinyomtatom minden egyes bitjét, 10-es méretű pufferben fogadva. Ez a méret az Ön személyes választásától függően bármi lehet.

Ezután, ha a kapott üzenet megegyezik a teljes üzenettel, akkor az üzenetet csak beérkezett teljes infóként nyomtatom, ezt követően a soroktól mentesítettem az üzenetet a betöltések () segítségével.

A fenti program kimenete a következő:

Ezzel eljutottunk a Python Socket programozásáról szóló cikkünk végéhez. Remélem, minden fogalmat világosan megértett.

Győződjön meg róla, hogy a lehető legtöbbet gyakorolja, és állítsa vissza a tapasztalatait.

Van egy kérdésünk? Kérjük, említse meg a „Socket programozás a Pythonban” blog megjegyzés rovatában, és amint lehetséges, kapcsolatba lépünk Önnel.

Ha mélyreható ismereteket szeretne szerezni a Pythonról és a különböző alkalmazásokról, regisztrálhat élőben 24/7 támogatással és élethosszig tartó hozzáféréssel.