[Disclaimer: poniższy artykuł w żadnym wypadku nie jest skierowany przeciw żadnemu językowi (zwłaszcza PHP), nic nie sugeruje ani do niczego nie namawia. Wszelkie uwagi, narzekania, komentarze i łaty jak zwykle mile widziane.]

Korzystanie z gniazd w Pythonie jest bardzo proste; konstrukcje są analogiczne do tych w C choć prostsze (przykładowo, przy funkcjach send() i recv() długość przekazywanej wiadomości jest ustawiana implicite). Weźmy prosty przykład: chcielibyśmy wyposażyć naszego mikroagenta w możliwość sprawdzania statusu w trakcie działania. Ot, choćby przez przeglądarkę – bo to ostatnio bardzo modne.
Za obsługę gniazd odpowiedzialny jest moduł socket(co ciekawe, dostępny nie tylko na platformach uniksowych, ale również pod Windows i kilkoma innymi). Pierwszą czynnością do wykonania jest utworzenie gniazda, następnie korzystamy z funkcji bind() i listen() (argumenty analogiczne jak w C – man 2 bind, man 2 listen itd.). Warto jedynie zauważyć, że pythonowy bind w nowszych wersjach interpretera (2.x) przyjmuje jednoargumentowy zbiór („krotkę” – tuple) a nie dwa argumenty, jak to miało miejsce w Pythonie 1.5 i wcześniejszych. Następnie sprawdzamy, czy nie nadchodzą połączenia – warto dodać krótkie opóźnienie, by nie pożerać niepotrzebnie zasobów systemu. W przypadku otrzymania danych, wysyłamy w odpowiedzi stronę HTML. To bardzo prymitywne rozwiązanie – odpowiadamy na *każde* żądanie, co w większości przypadków byłoby bezsensowne, jednak dla naszych celów w zupełności wystarczy.
Przykładowa funkcja może wyglądać tak:

  def nasluchuj(n):      s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)      s.bind(('localhost',8081))      s.listen(2)      while 1:          conn,addr = s.accept()          time.sleep(0.1)          data = conn.recv(1024)          if not data: break          conn.send(a_string_with_html)          conn.close()  

No dobrze – ale jeśli wykorzystamy tę funkcję, program będzie ją wykonywał w nieskończoność; gdzie tu miejsce na właściwą część programu? Rozwiążemy to w najprostszy sposób z możliwych: wykorzystamy wątkowanie. W Pythonie najprościej jest skorzystać z modułu thread. Wystarczy więc dopisać na początku thread.start_new_thread(nasluchuj,('',)), by rozpocząć nowy wątek, którego zadaniem będzie nasłuchiwanie żądań i wysyłanie statusu do przeglądarki. Jeśli zaś chodzi o samą treść wysyłanych informacji, możemy wykorzystać choćby getrusage() z modułu resource.


Jak zwykle, kompletny kod programu można obejrzeć tutaj (pamiętając o standardowych zastrzeżeniach), zaś plik wraz z niestandardowymi modułami można pobrać stąd.
Archiwalny news dodany przez użytkownika: arturs.
Kliknij tutaj by zobaczyć archiwalne komentarze.

Oznaczone jako → 
Share →