Python Socket programozás - Mielőtt elkezdem a Python Socket Programming használatát, remélem, hogy jó ismereteid vannak a pythonról. Ha ismeritek Djangot, akkor még könnyebb lenne megérteni. Nem, a socket programozás nem kapcsolódik a Django-hoz, de a Python socket programozás és a Django terminológiája szinte ugyanaz, bár két különböző kategóriába sorolhatók. Tehát kezdetben mi pontosan a Python Socket Programming? A Python Socket programozás nemcsak a pythonban található, hanem a Java és szinte az összes többi programozási nyelvben is. De a python esetében a socket programozás valójában nagyon könnyen érthető. A Python Socket programozás hálózati programozást jelent. Magában foglalja az ügyféloldali és a Python Socket szerveroldali kódokat. De ez a meghatározás ugyanolyan jó, mint egy könyv, amelyben a C programozás szerepel a szoftver fejlesztésében. És nem, nem vagyok itt. Azért vagyok itt, hogy megbizonyosodjon arról, hogy alaposabban megérti a Python socket programozás alapjait, mielőtt ténylegesen elkezdené írni a saját socket moduljait. Tehát kezdjük meg és nézzük meg, hogyan működik a socket mind az ügyfél, mind a Python Socket szerver oldalán.

Mi a Python Socket Programming?

Ha megtanultak a C programozást, akkor a python socket programozás megtanulása a Pythonban nagyon egyszerű lenne, mivel szinte azonosak. Az egyszerűbbé tétele érdekében a python socket programozás csak egy darab kódot tartalmaz arra vonatkozóan, hogy a hálózati számítógépek hogyan kommunikálnak egymással. És ez nem csak egy LAN alapú hálózattal ér véget, hanem WAN, MAN és intranet alapú hálózatokat is támogat. Még aljzatokat is használunk mindennapi életünkben. Nem értem? Hadd mondjak egy egyszerű példát. Ha csatlakozni akar, mondjuk a Facebook.com, egyszerűen írja be ugyanazt az URL-sávba. Tehát ezt a kapcsolatot, amelyet éppen létrehozott, nem csak a DNS-cucc hoz létre. Mindezt a python socket programozásával lehet konfigurálni. Az aljzatok döntik el, hogy a két hálózat hogyan kommunikál. Bármely kommunikáció, amely egy hálózaton megy keresztül, legyen az videó, VOIP kapcsolatok vagy csak szöveg; minden egy aljzaton megy keresztül. Most, hogy tudjuk, mi az aljzat, fejleszthetjük el a saját aljzatunkat pythonban.

Képforrás: pixabay.com

A Python Socket programozás típusai

Most rengeteg aljzat van odakint. De nem fogunk rólunk beszélni, mivel mindegyiket itt nem tudom lefedni. Létrehozhat egy UDP-aljzatot, TCP-aljzatot vagy akár port-aljzatot is, és még sok más létezik, ha megyek. De ma inkább megvizsgálnám a TCP és az UDP aljzatokat, mivel ezek a legalapvetőbbek, és rendkívül jóak lehetnek kezdőpontként a Python Socket programozás megkezdéséhez.

  • UDP foglalatok programozása

A User Datagram Protocol vagy az általánosan UDP néven ismert alternatív protokoll a TCP számára, amely csomagokat továbbít az egyik gazdagépről a másikra. A TCP-vel (átviteli vezérlő protokoll) ellentétben az UDP kapcsolat nélküli protokoll és nem stream-orientált. Ez azt jelenti, hogy az UDP szerver az összes gazdagépről csak a beérkező csomagokat fogja el, anélkül hogy megbízható forráskapcsolatot azonosítana. Ehhez a socket.socket funkciót használjuk. A Python-ban a következő módon létrejön egy egyszerű UDP-aljzat:

socket importálása # socket modul importálása python könyvtárból # Most létre kell hoznunk AF_INET-et és sock dgram socketss-t = socket.socket (socket.AF_INET, socket.SOCK_DGRAM) print “Socket Creation Successful”

Igen. Ennyi, és itt létrehoztuk egy egyszerű UDP foglalatot, a pythonban. A Python Socket programozása, vagy akár egy egyszerű socket létrehozása nem rakétatudomány. De az a nagy dolog, hogy az UDP szervert és az ügyfelet kódoljuk. Mivel az UDP aljzatok csatlakoztathatatlanok, a kommunikáció elindul a socket küldés és fogadás funkcióval. Ezeket a funkciókat nem kell egymáshoz csatlakoztatni. Csomagokat küldhet és fogadhat bármilyen véletlenszerű forrásból. UDP kiszolgáló jön létre így:

import socketport = 2924s = socket.socket (socket.AF_INET, socket.SOCK_DGRAM) s.bind ((“”, port)) print “Csatlakozás kérése a gépen található porthoz”, port

míg 1:

adatok, cím = s.recvfrom (1024)

adatok nyomtatása

Lehet, hogy ez nem sok, de valójában így készül. Bármelyik kikötő itt használható. Most véletlenszerűen választottam 2924-nek. Az UDP szervernek nyitott portra van szüksége, hogy nyitott legyen a bejövő kapcsolatok küldéséhez és fogadásához. Nincs hallgatva a port, nem fogadunk el kapcsolatokat vagy kéréseket. Csak hitelesítés nélkül történik. Próbálja meg futtatni a fenti kiszolgálót egy terminálon, és nézd meg, hogyan működik.

Ez csak egy egyszerű UDP szerver, amelyet készítettünk. Lehetővé teszi egy kicsit érdekesebbé és bonyolultabbá is:

'' Ez egy egyszerű UDP socket kiszolgáló '' import socketimport sys

HOST = “” # Itt kipróbálhatja az összes elérhető felületet

PORT = 2924 # Bármely véletlenszerű port, amelyet alapértelmezés szerint nem használ a Windows vagy a Linux disztribúciói

# Az UDP foglalat kódolása

próbáld ki :

s = socket.socket (socket.AF_INET, socket.SOCK_DGRAM)

nyomtatás “Socket inicializálva”

kivéve socket.error, msg:

nyomtatás “A foglalat létrehozása sikertelen. A következő hiba történt: ”+ str (msg (0)) + 'Message' + msg (1)

sys.exit ()

# Most össze kell kötnünk ezt a foglalatot a fenti gazdagéppel és porttal

próbáld ki:

s.bind ((HOST, PORT))

kivéve socket.error, msg:

nyomtatás “A kötéscsatlakozó nem sikerült. A következő hiba megszakította a kötést: ”+ str (msg (0)) + 'Message' + msg (1)

sys.exit ()

nyomtatás 'Aljzatkötés kész'

# Fenntartja a létrejött kapcsolatot

míg 1:

# adatgyűjtés az ügyféltől változó adatok és cím használatával

d = s.recvfrom (1024)

adatok = d (0)

cím = d (1)

ha nem adatok:

szünet

válasz = 'OK …' + adatok

s.sendto (válasz, cím)

nyomtatás 'Token üzenet (' + cím (0) + ':' + str (cím (1)) + ') -' + data.strip ()

s.close ()

Futtassa a fenti programot, és elindít egy UDP szervert a 2924 porton. Gratulálunk, hogy sikeresen létrehozott egy Socket in Python-ot. És ügyeljen arra, hogy vegye figyelembe, hogy az UDP-kiszolgáló a TCP-kiszolgálótól eltérően képes kezelni az ügyfelek számát, fő oka az, hogy az UDP-kiszolgálón nincs rögzített kapcsolat, mint a TCP-kiszolgáló esetében.

Ajánlott tanfolyamok

  • Tanúsító tanfolyam a Ruby hibakeresésben
  • PHP MySQL tanfolyam
  • VB.NET programozási tanúsító tanfolyam
  • Teljes ITIL Alapítvány képzés
  • UDP kliens programozás

Most, hogy sikeresen létrehoztuk az UDP szervert, szükségünk van egy kliensre, hogy megfelelő kapcsolatot létesítsen vele, hogy megismerjük annak működését. Tehát lehetővé teszi a megfelelő UDP-kliens létrehozását a Pythonban. Ez az ügyfél csatlakozik a fent létrehozott UDP szerverünkhöz:

'' Egyszerű UDP kliens usind aljzatok létrehozása '' import socketimport sys

# UDP foglalat létrehozása

próbáld ki:

s = socket.socket (socket.AF_INET, socket.SOCK_DGRAM)

kivéve socket.error:

nyomtatás 'Aljzat létrehozása sikertelen'

sys.exit ()

host = '127.0.0.1'; #Akkor is kipróbálhatja ennek az IP-nek a localhost insead-jét, mindkettő azonos.

port = 2924;

míg (1):

msg = raw_input ('Írjon be egy üzenetet, amelyet el kell küldeni a szervernek:')

próbáld ki :

#Most be kell állítanunk a karakterláncokat

s.sendto (msg, (host, port))

# Most adatokat és címet kell megszereznünk az ügyféltől az adatok és a cím használatával

d = s.recvfrom (1024)

válasz = d (0)

cím = d (1)

print 'Válasz a szerverről:' + válasz

kivéve socket.error, msg:

print 'A következő hiba jelentkezett:' + str (msg (0)) + 'Message' + msg (1)

sys.exit ()

Ja. UDP kliens létrehozása a Python Socket programozásban sokkal könnyebb, mint az UDP szerver létrehozása. De így van. Nem hiszem, hogy el kellene magyaráznom a fenti kódrészletet, mivel a # tag megjegyzésben már említettem az összes szükséges dolgot. Csak ellenőrizze, hogy az Ön által megadott IP-cím és port megfelelő-e, és a tűzfal nem blokkolja a kapcsolatot, különben minden esetben hibát okoz.

  • TCP Socket programozás

Most, hogy megtanultuk, hogyan lehet UDP-klienst és -kiszolgálót létrehozni, vessünk egy pillantást a TCP-aljzatok programozására. Ugyanazt a socket.socket függvényt fogjuk használni, hogy itt hozzunk létre egy TCP foglalatot.

socket importálása # A modul foglalatának importálása a python könyvtárakból # hozzon létre egy AF_INET-et, és folytassa a sockets = socket.socket (socket.AF_INET, socket.SOCK_STREAM) nyomtatás 'Socket Creation Successful'

Itt az AF_INET-t használják az Ipv4-címcsatlakozáshoz, a zokniáram pedig egy TCP-orientált protokoll. Ez egy egyszerű TCP-aljzat, amelyet készítettünk. Most elkészítjük ugyanazon fejlett verzióját. Kivételeket itt is dobunk, ugyanúgy, mint az UDP-kiszolgálók és ügyfelek létrehozásakor, így a csatlakozás meghibásodása esetén tudni fogjuk, hol található a program. A Socket.error az összes ilyen hiba kezelésére szolgál, hasonlóan az UDP programozásához.

Tehát most hozhatunk létre egy socket-et a fenti hibakezeléssel és csatlakozhatunk a facebook.com hosthoz. Így kell ezt megtenni:

import foglalat # a foglalat modulimport rendszerének importálása: s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

kivéve socket.error, msg:

print 'A foglalat létrehozása sikertelen. A következő hiba történt: '+ str (msg (0)) +', Hibaüzenet: '+ msg (1)

sys.exit ();

nyomtatás 'Aljzat létrehozása sikeres'

host = 'www.facebook.com'

port = 2924

próbáld ki:

remote_ip = socket.gethostbyname (host)

kivéve socket.gaierror:

print 'Helytelen gazdagép név. Kilépés …”

sys.exit ()

print '+ host + IP address' értéke '+ remote_ip

s.connect ((távoli_ip, port))

print 'Socket Connected to' + host + 'on ip' + remote_ip

Most már ez elég, ha csak kapcsolatba kell lépnünk. De nem ez a célunk. Olyan kapcsolatot kívánunk létrehozni, ahol mindkét végén adatokat küldhetünk és fogadhatunk. Adatokat küldhetünk a sendall funkció használatával. Tehát itt van, hogy megy:

import foglalat # a foglalat modulimport rendszerének importálása: s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

kivéve socket.error, msg:

print 'A foglalat létrehozása sikertelen. A következő hiba történt: '+ str (msg (0)) +', Hibaüzenet: '+ msg (1)

sys.exit ();

nyomtatás 'Aljzat létrehozása sikeres'

host = 'www.facebook.com'

port = 2924

próbáld ki:

remote_ip = socket.gethostbyname (host)

kivéve socket.gaierror:

print 'Helytelen gazdagép név. Kilépés …”

sys.exit ()

print '+ host + IP address' értéke '+ remote_ip

s.connect ((távoli_ip, port))

print 'Socket Connected to' + host + 'on ip' + remote_ip

# adatátvitel az sendall funkció használatával

üzenet = “GET / HTTP / 1.1 \ r \ n \ r \ n”

próbáld ki :

s.sendall (üzenet)

kivéve socket.error:

# Küldés sikertelen

nyomtatás 'Átviteli hiba'

sys.exit ()

nyomtatás 'Üzenet állapota: elküldve'

Most, hogy sikeres kapcsolatot létesítettünk, és adatokat küldhetünk, nézzük meg, hogyan tudnánk összesen megkapni az adatokat. Így működik:

import foglalat # a foglalat modulimport rendszerének importálása: s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

kivéve socket.error, msg:

print 'A foglalat létrehozása sikertelen. A következő hiba történt: '+ str (msg (0)) +', Hibaüzenet: '+ msg (1)

sys.exit ();

nyomtatás 'Aljzat létrehozása sikeres'

host = 'www.facebook.com'

port = 2924

próbáld ki:

remote_ip = socket.gethostbyname (host)

kivéve socket.gaierror:

print 'Helytelen gazdagép név. Kilépés …”

sys.exit ()

print '+ host + IP address' értéke '+ remote_ip

s.connect ((távoli_ip, port))

print 'Socket Connected to' + host + 'on ip' + remote_ip

# adatátvitel az sendall funkció használatával

üzenet = “GET / HTTP / 1.1 \ r \ n \ r \ n”

próbáld ki :

s.sendall (üzenet)

kivéve socket.error:

# Küldés sikertelen

nyomtatás 'Átviteli hiba'

sys.exit ()

nyomtatás 'Üzenet állapota: elküldve'

# Most, hogy adatokat nyerjünk, a recv funkciót használjuk annak elérésére

válasz = s.recv (4096)

nyomtatási válasz

Az utolsó dolog az, hogy bezárjuk a foglalatot, amelyet megtehetünk a következő kóddal:

s.close ()

És végül a kötelező rész. A kötés funkcióval összekapcsolhatjuk az aljzatokat ip-címekkel és portokkal.

import socketimport sysHOST = ”# Ez ugyanúgy történt, mint az UDP ProtocolPORT = 2924 # portban az adatok eléréséhez.

s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

nyomtatás 'Aljzat létrehozása sikeres'

próbáld ki:

s.bind ((HOST, PORT))

kivéve socket.error, msg:

print 'A kötés sikertelen. A hibát követően '+ str (msg (0)) +' Message '+ msg (1)

sys.exit ()

nyomtatás 'Socket Binding sikeres'

Most meg kell hallgatnunk a bejövő kapcsolatokat, ha szükségünk van a kiszolgálóra a csatlakozáshoz. Ezt megteheti a következő egyszerű paranccsal:

s.listen (10) print 'Hallgató elindítva'

És végül létre kell hoznia egy aljzatot az alábbi kapcsolatok elfogadásához:

import socketimport sysHOST = ”PORT = 2924

s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

nyomtatás 'Aljzat létrehozása sikeres'

próbáld ki:

s.bind ((HOST, PORT))

kivéve socket.error, msg:

print 'A kötés sikertelen. Következő hiba történt '+ str (msg (0)) +' Message '+ msg (1)

sys.exit ()

nyomtatás 'Aljzatkötés sikeres'

s.listen (10)

nyomtatás 'Hallgató elindítva'

#A kapcsolatok elfogadása

conn, addr = s.accept ()

# Csatlakoztatott ügyfél-információk biztosítása

print 'Kapcsolat létrejött' + addr (0) + ':' + str (addr (1))

Valójában ennél sokkal több van. Kódokat írhatunk a kezelőknek és más dolgoknak is. De azt hiszem, most ez lenne. Győződjön meg róla, hogy ezek az alapok helyesek-e, miután a fennmaradó részek csak egy darab tortát tartalmaznak a tanuláshoz.

Első képforrás: pixabay.com

Kapcsolódó cikkek:-

Íme néhány cikk, amely segít részletesebben megismerni a Python Socket programozást, tehát csak keresse meg a linket.

  1. 25 leglenyűgözőbb Python interjú kérdés és válasz
  2. Karrier Pythonban
  3. Mik a Python használatának előnyei és korlátai?
  4. Fontos különbség a Python és a Ruby teljesítmény között
  5. Bevezetés a socket programozásba a PHP-ben
  6. Socket programozás Java-ban Aljzat osztály módszer

Kategória: