A Python alacsony és magas szinten is biztosítja a hálózati kommunikáció megvalósítására alkalmazott eszközöket. Alacsony szinten az operációs rendszer által nyújtott alapvető szolgáltatásokat használja ki, ami lehetővé teszi a szerver és kliens alkalmazások számára mind a kapcsolatorientált, mind a kapcsolatnélküli protokollok használatát. Magasabb szintű eszközöket támogató programkönyvtárai olyan alkalmazásszintű hálózati protokollokat támogatnak, mint az FTP, HTTP stb.
A Python socket modulja hozzáférést biztosít az általános BSD socket interfészhez, amely az összes modern operációs rendszeren megtalálható alacsonyszintű szolgáltatásokat tartalmaz, pl. Unix rendszereken, Windows-on, Mac OS X-en stb. A modul az objektumorientált átírását valósítja meg a Unix socket-kezelési mechanizmusainak: a socket() hívás egy socket objektummal tér vissza, amelynek metódusain keresztül a standard socket műveleteket hajthatjuk végre, ugyanakkor, a rendszerszintű eljárásoknál összetettebb feladatokra is képes, pl. automatikus memória-allokáció.
Egy socket létrehozására a socket() hívást használhatjuk, melynek általános szintaxisa a következő:
ahol
socket_family: | A kommunikáció során használt címzés-család. Értékei konstansok, pl. socket.AF_INET (IPV4 protokoll, TCP és UDP egyaránt) socket.AF_INET6 (IPV4 protokoll, TCP és UDP egyaránt) socket.PF_UNIX (UNIX protokoll) stb. |
socket_type: | A két végpont közötti adatátvitel típusa socket.SOCK_STREAM: kapcsolatorientált kommunikáció kezdeményezésére socket.SOCK_DGRAM: datagram alapú kommunikáció kezdeményezésére |
protocol: | A socketen belüli protokollok meghatározása.Normális esetben egy protokollcsaládon belül egy protokollt használunk, így az alapértelmezett érték 0 - elhagyható. |
bind() | Címet (host – port pár) kapcsol egy sockethez |
listen() | Figyeli a bejövő kapcsolatfelvételi kérelmeket |
accept() | Elfogadja a kapcsolatfelvételt, vár a kommunikáció megkezdéséig |
connect() | Létrehoz egy kapcsolatobjektumot |
send() | TCP üzenetet küld |
recv() | TCP üzenetet fogad |
sendto() | UDP üzenetet küld |
recvfrom() | UDP üzenetet fogad |
close() | Zárja a socketet |
A magasabbszintű, hálózati eszközöket támogató modulok egyike, mely leegyszerűsíti a szerverek megvalósítását. Négy alapvető szervertípust különböztetünk meg, melyek osztályai:
TCPServer | TCP protokoll használatával folytonos adatátvitelt biztosít a szerver és a kliens között |
UDPServer | UDP protokoll használatával, azaz az információt diszkrét csomagok formájában szállítva kommunikál (datagram) |
UnixStreamServer | Unix domain socket-et használó, folytonos kommunikációt biztosító szerver. Csak Unix rendszereken elérhető. |
UnixDatagramServer | Unix domain socket-et használó, datagram szerver. Csak Unix rendszereken elérhető. |
Az osztályok között fennálló hierarchia a következő:
Ezek a szervertípusok a kéréseket szinkronizáltan teljesítik, azaz minden kérés teljesítését csak akkor kezdik meg, ha az előző kérés végrehajtása már lefutott. Számításigényes, hosszú, nagy adatmennyiséggel dolgozó kérések esetén érdemes őket külön folyamatokba, szálakba szervezni; az asszinkron viselkedés megvalósítására a ForkingMixIn és ThreadingMixIn osztályok szolgálnak. Olyan rendszerkörnyezet esetén, ahol a folyamatok és szálak létrehozása és kezelése költséges művelet, a select() metódus használható: ez a művelet a beérkező kérések közül választ egyet (vagy a soronkövetkezőt, vagy egy éppen bejövőt), majd annak végrehajtását kezdeményezni.
Egy szerver megvalósítását egy kéréskiszolgáló (request handler) definiálásával kell kezdeni, melyet a BaseRequestHandler osztályból való származtatással tehetünk meg. Az osztály handle() metódusának felüldefiniálásával egyéni módon kezelhetjük a bejövő kéréseket. A választott szervertípusunk példányosításakor meghatározzuk a szerver címét (host, port) és a request handler típusát. A kérések teljesítésének módjának különbőzőképpen kell zajlania TCP és UDP kapcsolatok esetén, ennek áthidalására a StreamRequestHandler és a DatagramRequestHandler osztályok nyújtanak megoldást.
A legtöbb művelet alapértelmezett implementációja üres; az egyes eljárások felüldefiniálásával egyéni működést definiálhatunk a szerver számára.
Python3-ban az ezelőtt különálló modult alkotó BaseHTTPServer-t beleolvasztották a http.server modulba, mely két fontos osztályt is tartalmaz webszerverek megvalósítására (SimpleHTTPServer és CGIHTTPServer).
A HTTPServer osztály a socketserver.TCPServer osztály leszármazottja, tehát implementálja a BaseServer interfészt. Az osztály példányosításakor (HTTPServer(server_address, RequestHandlerClass)¶) a szerver címét várja, melyet a server_name és server_port példányváltozók tárolnak a program futása során. A szerverobjektumot a request handler-ből is elérjük annak server példányváltozóján keresztül.
A BaseHTTPRequestHandler osztály leszármazottjai a szerverhez beérkező kérések kiszolgálásáért felelnek; értelmezik a kérést, majd végrehajtják a kérés típusának megfelelő eljárást.
A Python3 előtt httplib néven szereplő modul HTTP és HTTPS protokollok kliens oldali használatára alkalmas osztályokat tartalmaz.
HTTPConnection(host[, port[, strict[, timeout[, source_address]]]])
Egy HTTPConnection objektum egy HTTP szerverrel lebonyolított tranzakciót reprezentál. Példányosítása egy hostnév és további opcionális paraméterek átadásával történik: portszám (alapértelmezett: 80), true/false érték attól függően, meg kívánjuk-e jeleníteni a BadStatusLine hibaüzeneteket, timeout másodpercekben, valamint a forrás címe host-port pár formájában.
HTTPSConnection(host[, port[, key_file[, cert_file[, strict[, timeout[, source_address]]]]]])
A HTTPConnection osztály leszármazottja SSL alapú kommunikáció használatára. Az opcionális key_file paraméter privát kulcsot, a cert_file pedig tanusítványt vár.
HTTPResponse(sock[, debuglevel=0][, strict=0])
Példányai a sikeres kapcsolatfelvétel során térnek vissza – felhasználó nem hozhat létre példányokat.
HTTPMessage
HTTP üzenetek hordozója, melyet a felhasználó közvetlenül nem példányosíthat.
HTTPException
A modulban található összes kivétel őse, az Exception osztály leszármazottja.
NotConnected
A kapcsolat nem jött létre
InvalidUrl
A port nem numerikus értéket hordoz vagy üres.
BadStatusLine
A szerver visszaadott státuszkódja ismeretlen értéket hordoz.
HTTP_PORT
A http protokoll alapértelmezett portja (80)
HTTPS_PORT
A https protokoll alapértelmezett portja (443)
PROCESSING | 102 |
OK | 200 |
CREATED | 201 |
ACCEPTED | 202 |
FOUND | 302 |
TEMPORARY_REDIRECT | 307 |
UNAUTHORIZED | 401 |
FORBIDDEN | 403 |
NOT_FOUND | 404 |
REQUEST_TIMEOUT | 408 |
BAD_GATEWAY | 502 |
SERVICE_UNAVAILABLE | 503 |