Nastavení internetového serveru v Pythonu pomocí Socket

Tento doplněk k tutoriálu síťových klientů ukazuje, jak implementovat jednoduchý webový server v systému Windows Krajta. Jistě, to není náhrada za Apache nebo Zope. Existují také robustnější způsoby implementace webových služeb v Pythonu pomocí modulů jako BaseHTTPServer. Tento server používá výhradně soketový modul.

Vzpomenete si, že soketový modul je páteří většiny modulů webové služby Python. Stejně jako u jednoduchého síťového klienta, i stavění serveru s ním transparentně ilustruje základy webových služeb v Pythonu. BaseHTTPServer sám importuje soketový modul, aby ovlivnil server.

V rámci kontroly dochází ke všem síťovým transakcím mezi klienty a servery. Ve většině protokolů se klienti ptají na určitou adresu a přijímají data.

Na každé adrese může běžet více serverů. Limit je v hardwaru. S dostatečným hardwarem (RAM, rychlost procesoru atd.) Může stejný počítač sloužit jako webový server, ftp server a poštovní server (pop, smtp, imap nebo všechny výše uvedené) najednou. Každá služba je spojena s portem. Port je vázán na soket. Server naslouchá svému přidruženému portu a poskytuje informace o přijetí požadavků na tento port.

Chcete-li ovlivnit síťové připojení, musíte znát hostitele, port a akce povolené na tomto portu. Většina webových serverů běží na portu 80. Abychom se však vyhnuli konfliktu s nainstalovaným serverem Apache, bude náš webový server spuštěn na portu 8080. Aby nedocházelo ke konfliktu s jinými službami, je nejlepší ponechat služby HTTP na portu 80 nebo 8080. To jsou dva nejčastější. Samozřejmě, pokud jsou použity, musíte najít otevřený port a upozornit uživatele na změnu.

Stejně jako u síťového klienta byste si měli uvědomit, že tyto adresy jsou společnými čísly portů pro různé služby. Dokud klient požádá o správnou službu na správném portu na správné adrese, bude komunikace stále probíhat. Google Například poštovní služba se původně nespouštěla ​​na společných číslech portů, ale protože uživatelé vědí, jak přistupovat ke svým účtům, mohou uživatelé stále dostávat poštu.

Na rozdíl od síťového klienta jsou všechny proměnné na serveru pevně zapojeny. Jakákoli služba, která se očekává, že bude spuštěna nepřetržitě, by neměla mít proměnné své interní logiky nastavené na příkazovém řádku. Jedinou variací na to by bylo, kdyby z nějakého důvodu chtěli, aby byla služba spuštěna příležitostně a na různých číslech portů. Pokud by tomu tak ale bylo, stále byste mohli sledovat systémový čas a podle toho měnit vazby.

Jak již bylo zmíněno, server musí znát hostitele, ke kterému má být přidružen, a port, na kterém má poslouchat. Pro naše účely budeme mít službu platit pro jakékoli jméno hostitele vůbec.

Jak již bylo zmíněno, port bude 8080. Pokud tedy používáte tento server ve spojení se síťovým klientem, budete muset změnit číslo portu, které se v něm používá program.

Zda si vyžádat informace nebo jim posloužit, za účelem přístupu k internetu Internet, musíme vytvořit soket. Syntaxe tohoto hovoru je následující:

První dva jsou samozřejmě internetové protokoly. V těchto rodinách je přístupné vše, co cestuje přes internet. Mnoho sítí stále nefunguje na IPv6. Pokud tedy nevíte jinak, je nejbezpečnější výchozí nastavení na IPv4 a použití AF_INET.

Nejběžnějšími typy jsou SOCK_STEAM a SOCK_DGRAM, protože fungují na dvou protokolech sady IP (TCP a UDP). Poslední tři jsou mnohem vzácnější, a proto nemusí být vždy podporovány.

Po vytvoření soketu musíme nastavit možnosti soketu. Pro jakýkoli objekt soketu můžete nastavit možnosti soketu pomocí metody setsockopt (). Syntaxe je následující:

Pokud chceme dát zpětnou vazbu osobě, která volá server, můžeme nyní zadat příkaz print, abychom potvrdili, že server je funkční a funkční.

Po nastavení serveru musíme nyní říct Krajta co dělat, když je v daném portu podán požadavek. Za tímto účelem odkazujeme na požadavek podle jeho hodnoty a používáme jej jako argument trvalé smyčky while.

Po zadání požadavku by server měl požadavek přijmout a vytvořit objekt souboru, který s ním bude interagovat.

V tomto případě server používá stejný port pro čtení a zápis. Proto je makefile metoda uvedena argument 'rw'. Nulová délka velikosti vyrovnávací paměti jednoduše ponechává část souboru, která má být určena dynamicky.

Pokud nechceme vytvořit server s jednou akcí, dalším krokem je čtení vstupu ze souboru objektu. Když to uděláme, měli bychom být opatrní, abychom odstranili tento vstup nadměrného bílého prostoru.

Požadavek bude mít podobu akce, po které následuje stránka, protokol a použitá verze protokolu. Pokud chce obsluhovat webovou stránku, rozdělí se tento vstup, aby se získala požadovaná stránka, a pak tuto stránku přečte do proměnné, která se poté zapíše do objektu soketového souboru. Funkce pro čtení souboru do slovníku najdete v blogu.

Aby byl tento tutoriál poněkud ilustrativnější, co lze s modulem soketu udělat, vzdáme se této části serveru a místo toho ukážeme, jak lze nuanci prezentovat data. Zadejte dalších několik řádků do program.

Pokud někdo odesílá webovou stránku, první řádek je příjemným způsobem, jak do webového prohlížeče vložit data. Pokud je vynechán, většina webových prohlížečů bude výchozí vykreslování HTML. Pokud ji však obsahuje, musí za ní následovat „OK“ dva nové řádky. Používají se k rozlišení informací protokolu od obsahu stránky.

Syntaxe prvního řádku, jak si pravděpodobně myslíte, je protokol, verze protokolu, číslo zprávy a stav. Pokud jste někdy přešli na webovou stránku, která se přesunula, pravděpodobně jste obdrželi chybu 404. Zpráva 200 je jednoduše pozitivní zpráva.

Zbytek výstupu je jednoduše webová stránka rozdělená na několik řádků. Všimněte si, že server lze naprogramovat tak, aby ve výstupu používal uživatelská data. Poslední řádek odráží webový požadavek tak, jak byl přijat serverem.

Nakonec, jako závěrečné úkony žádosti, musíme zavřít objekt souboru a soket serveru.

Nyní uložte tento program pod rozpoznatelným názvem. Po zavolání pomocí 'python program_name.py', pokud jste naprogramovali zprávu pro potvrzení, že služba běží, mělo by se toto vytisknout na obrazovku. Zdá se, že se terminál zastaví. Vše je, jak by mělo být. Otevřete webový prohlížeč a přejděte na localhost: 8080. Pak byste měli vidět výstup příkazů pro zápis, které jsme dali. Vezměte prosím na vědomí, že kvůli tomuto prostoru jsem do tohoto programu nezavedl manipulaci s chybami. Jakýkoli program vydaný do „divočiny“ by však měl.