Nastavte internetový server v Pythone pomocou Socketu

01 z 10

Úvod do Socketu

Ako doplnok k tutoriálu sieťového klienta tento tutoriál ukazuje, ako implementovať jednoduchý webový server Python . Určite to nie je náhrada za Apache alebo Zope. Existujú aj robustnejšie spôsoby implementácie webových služieb v Pythone pomocou modulov ako BaseHTTPServer. Tento server používa výhradne soketový modul.





Určite si spomeniete, že modul socket je chrbticou väčšiny modulov webových služieb Pythonu. Rovnako ako v prípade jednoduchého sieťového klienta, zostavenie servera s ním transparentne ilustruje základy webových služieb v Pythone. Samotný BaseHTTPServer importuje modul soketu, aby ovplyvnil server.

02 z 10

Spustené servery

Ako prehľad, všetky sieťové transakcie prebiehajú medzi klientmi a servermi. Vo väčšine protokolov sa klienti pýtajú na určitú adresu a prijímajú údaje.



V rámci každej adresy môže bežať množstvo serverov. Limit je v hardvéri. S dostatočným hardvérom (RAM, rýchlosť procesora atď.) môže ten istý počítač slúžiť ako webový server, ftp server apoštový server(pop, smtp, imap alebo všetky vyššie uvedené) všetky súčasne. Každá služba je spojená s portom. Port je viazaný na zásuvku. Server počúva svoj priradený port a poskytuje informácie o prijatí požiadaviek na tomto porte.

03 z 10

Komunikácia cez zásuvky

Ak chcete ovplyvniť sieťové pripojenie, musíte poznať hostiteľa, port a akcie povolené na tomto porte. Väčšina webových serverov beží na porte 80. Aby sme sa však vyhli konfliktu s nainštalovaným serverom Apache, náš webový server pobeží na porte 8080. Aby sa predišlo konfliktu s inými službami, je najlepšie ponechať služby HTTP na porte 80 resp. 8080. Toto sú dva najbežnejšie. Je zrejmé, že ak sa používajú, musíte nájsť otvorený port a upozorniť používateľov na zmenu.



Rovnako ako v prípade sieťového klienta by ste si mali uvedomiť, že tieto adresy sú spoločnými číslami portov pre rôzne služby. Pokiaľ klient požiada o správnu službu na správnom porte na správnej adrese, komunikácia bude stále prebiehať. Google napríklad poštová služba pôvodne nefungovala na bežných číslach portov, ale pretože vedia, ako pristupovať k svojim účtom, používatelia môžu stále dostávať svoju poštu.

Na rozdiel od sieťového klienta sú všetky premenné na serveri pevne spojené. Každá služba, od ktorej sa očakáva, že bude bežať nepretržite, by nemala mať nastavené premenné svojej internej logiky na príkazovom riadku. Jedinou variáciou by bolo, ak by ste z nejakého dôvodu chceli, aby služba bežala príležitostne a na rôznych číslach portov. Ak by to tak však bolo, stále by ste mohli sledovať systémový čas a podľa toho meniť väzby.

Takže náš jediný dovoz je zásuvkový modul.

|_+_||_+_|

Ďalej musíme deklarovať niekoľko premenných.



04 z 10

Hostitelia a porty

Ako už bolo spomenuté, server potrebuje poznať hostiteľa, ku ktorému má byť priradený, a port, na ktorom má počúvať. Pre naše účely bude služba platiť pre akýkoľvek názov hostiteľa.

|_+_||_+_|

Port, ako už bolo spomenuté, bude 8080. Ak teda používate tento server v spojení so sieťovým klientom, budete musieť zmeniť číslo portu použité v tomto program .



05 z 10

Vytvorenie zásuvky

Či požiadať o informácie alebo ich doručiť, aby ste získali prístup k internet , musíme vytvoriť zásuvku. Syntax tohto volania je nasledovná:

|_+_||_+_|

Rozpoznané rodiny zásuviek sú:



  • AF_INET: protokoly IPv4 (TCP aj UDP)
  • AF_INET6: Protokoly IPv6 (TCP aj UDP)
  • AF_UNIX: Protokoly domény UNIX

Prvé dva sú samozrejme internetové protokoly. V týchto rodinách sa dá dostať ku všetkému, čo cestuje cez internet. Mnoho sietí stále nefunguje na IPv6. Ak teda neviete inak, najbezpečnejšie je predvolene nastaviť IPv4 a použiť AF_INET.

Typ zásuvky sa vzťahuje na typ komunikácie používanej prostredníctvom zásuvky. Päť typov zásuviek je nasledujúcich:



  • SOCK_STREAM: prúd bajtov TCP orientovaný na spojenie
  • SOCK_DGRAM: UDP prenos datagramov (samostatné IP pakety, ktoré sa nespoliehajú na potvrdenie klient-server)
  • SOCK_RAW: surová zásuvka
  • SOCK_RDM: pre spoľahlivé datagramy
  • SOCK_SEQPACKET: sekvenčný prenos záznamov cez spojenie

Zďaleka najbežnejšie typy sú SOCK_STEAM a SOCK_DGRAM, pretože fungujú na dvoch protokoloch sady IP (TCP a UDP). Posledné tri sú oveľa zriedkavejšie, a preto nemusia byť vždy podporované.

Vytvorme teda socket a priraďme ho k premennej.

|_+_||_+_| 06 z 10

Nastavenie možností zásuvky

Po vytvorení zásuvky potom musíme nastaviť možnosti zásuvky. Pre akýkoľvek objekt soketu môžete nastaviť možnosti soketu pomocou metódy setsockopt(). Syntax je nasledovná:

socket_object.setsockopt(úroveň, názov_možnosti, hodnota) Pre naše účely používame nasledujúci riadok:
|_+_|

Pojem „úroveň“ sa vzťahuje na kategórie možností. Pre možnosti na úrovni zásuvky použite SOL_SOCKET. Pre čísla protokolov by ste použili IPPROTO_IP. SOL_SOCKET je konštantný atribút zásuvky. To, ktoré možnosti sú k dispozícii ako súčasť každej úrovne, závisí od vášho operačného systému a od toho, či používate IPv4 alebo IPv6.
Dokumentáciu pre Linux a súvisiace systémy Unix nájdete v dokumentácii systému. Dokumentáciu pre používateľov spoločnosti Microsoft možno nájsť na webovej lokalite MSDN. V čase písania tohto článku som nenašiel dokumentáciu Mac o programovaní zásuviek. Keďže Mac je zhruba založený na BSD Unix, je pravdepodobné, že bude implementovať celý rad možností.
Aby sme zabezpečili opätovnú použiteľnosť tohto soketu, používame možnosť SO_REUSEADDR. Dalo by sa obmedziť server tak, aby bežal iba na otvorených portoch, ale zdá sa to zbytočné. Pamätajte však, že ak sú na rovnakom porte nasadené dve alebo viac služieb, účinky sú nepredvídateľné. Človek si nemôže byť istý, ktorá služba dostane ktorý balík informácií.
Nakoniec, '1' pre hodnotu je hodnota, podľa ktorej je požiadavka na soket v programe známa. Týmto spôsobom môže program počúvať na zásuvke veľmi jemnými spôsobmi.
07 z 10

Pripojenie portu k zásuvke

Po vytvorení socketu a nastavení jeho možností potrebujeme naviazať port na socket.

|_+_||_+_|

Väzba je hotová. Teraz povieme počítaču, aby počkal a počúval na tomto porte.

|_+_||_+_|

Ak chceme poskytnúť spätnú väzbu osobe, ktorá volá server, mohli by sme teraz zadať príkaz na tlač, aby sme potvrdili, že server je v prevádzke.

08 z 10

Spracovanie serverovej požiadavky

Po nastavení servera to teraz musíme povedaťPythončo robiť, keď je na danom porte podaná požiadavka. Na tento účel odkazujeme na požiadavku jej hodnotou a používame ju ako argument trvalej slučky while.

Po zadaní požiadavky by mal server prijať požiadavku a vytvoriť objekt súboru na interakciu s ním.

|_+_||_+_|

V tomto prípade server používa rovnaký port na čítanie a zápis. Preto má metóda makefile argument 'rw'. Nulová dĺžka veľkosti vyrovnávacej pamäte jednoducho ponecháva túto časť súboru dynamicky určenú.

09 z 10 Odosielanie údajov Klientovi

Ak nechceme vytvoriť jednočinný server, ďalším krokom je čítanie vstupu z objektu súboru. Keď to urobíme, mali by sme byť opatrní, aby sme z tohto vstupu odstránili prebytočné medzery.

|_+_||_+_|

Požiadavka príde vo forme akcie, po ktorej bude nasledovať stránka, protokol a používaná verzia protokolu. Ak niekto chce obsluhovať webovú stránku, rozdelí tento vstup na získanie požadovanej stránky a potom túto stránku načíta do premennej, ktorá sa potom zapíše do objektu súboru soketu. Funkciu na načítanie súboru do slovníka nájdete v blogu.

Aby bol tento tutoriál o niečo viac názorný na to, čo sa dá robiť so socketovým modulom, vynecháme túto časť servera a namiesto toho ukážeme, ako je možné upraviť prezentáciu údajov. Zadajte niekoľko nasledujúcich riadkov do program .

|_+_||_+_| 10 z 10

Záverečná analýza a vypnutie

Ak odosielate webovú stránku, prvý riadok je pekný spôsob zavedenia údajov do webového prehliadača. Ak sa vynechá, väčšina webových prehliadačov predvolene použije vykresľovanie HTML . Ak ho však obsahuje, musí nasledovať „OK“. dva znaky nového riadku. Používajú sa na rozlíšenie informácií protokolu od obsahu stránky.

Syntax prvého riadku, ako pravdepodobne tušíte, je protokol, verzia protokolu, číslo správy a stav. Ak ste niekedy prešli na webovú stránku, ktorá sa presunula, pravdepodobne ste dostali chybu 404. Správa 200 je tu jednoducho potvrdzujúca správa.

Zvyšok výstupu je jednoducho webová stránka rozdelená na niekoľko riadkov. Všimnite si, že server môže byť naprogramovaný tak, aby používal užívateľské dáta vo výstupe. Posledný riadok odráža webovú požiadavku tak, ako bola prijatá serverom.

Nakoniec, ako záverečné úkony požiadavky, musíme zatvoriť objekt súboru a soket servera.

|_+_||_+_|

Teraz uložte tento program pod rozpoznateľným názvom. Keď ho zavoláte pomocou 'python program_name.py', ak ste naprogramovali správu na potvrdenie spustenia služby, mala by sa vytlačiť na obrazovku. Zdá sa, že terminál sa potom zastaví. Všetko je ako má byť. Otvorte webový prehliadač a prejdite na localhost:8080. Potom by ste mali vidieť výstup príkazov zápisu, ktoré sme zadali. Upozorňujeme, že kvôli priestoru som v tomto programe neimplementoval spracovanie chýb. Každý program uvoľnený do „divokej“ by však mal.