Webserver

Vracia ako text všetko, čo poslal klient.

   1 #!/usr/bin/env python
   2 import socket
   3 import sys
   4 import os
   5 import signal
   6 import re
   7 
   8 
   9 
  10 # Vytvorime TCP socket
  11 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  12 # Po ukonceni zostane niekedy socket v stave FIN_WAIT_2
  13 # REUSEADDR umozni opatovny bind.
  14 s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  15 # Naviazeme ho na port 2222 pre vsetky lokalne adresy
  16 s.bind(('',2222))
  17 # Najviac 5 spojeni bude cakat vo fronte
  18 s.listen(5)
  19 
  20 # Toto je kvoli tomu, aby nam nezostavali zombie 
  21 # procesy a neprerusoval nas signal SIGCHLD
  22 signal.signal(signal.SIGCHLD,signal.SIG_IGN)
  23 
  24 try:
  25     while True:
  26         connected_socket,address=s.accept()
  27         print 'Connected by',address
  28         # Po pripojeni klienta sa forkneme.
  29         # Child proces obsluzi klienta a zavola sys.exit()
  30         # Parent proces ocakava
  31         # dalsieho klienta.
  32         pid_chld=os.fork()
  33         if pid_chld<0:
  34             print "fork vratil chybu"
  35             sys.exit(1)
  36         if pid_chld==0:
  37             # Toto robi child proces.
  38             # Vytvorime si file object z pripojeneho
  39             # socketu
  40             f=connected_socket.makefile()
  41             line=f.readline()
  42             m=re.match('^GET *([^ ]*).*$',line)
  43             response='Client said:\n'+line
  44             for line in f:
  45                 response+=line
  46                 # CR LF ukoncuje request
  47                 if line=='\r\n':
  48                     break
  49             f.write('HTTP/1.1 200 OK')
  50             f.write('Content-type: text/plain\r\n')
  51             f.write('Content-length: %d\r\n' % len(response))
  52             f.write('\r\n')
  53             f.write(response)
  54             # f je duplikovany connected_socket, preto
  55             # ho musime zavriet osobitne.
  56             f.close()
  57             # Takymto sposobom sa spravne zatvara
  58             # socket, v prikladoch v dokumentacii to
  59             # je zle.
  60             connected_socket.shutdown(socket.SHUT_RDWR)
  61             connected_socket.close()
  62             print address,'disconnected'
  63             sys.exit(0)
  64 except KeyboardInterrupt:
  65     pass
  66 s.close()
webserver.py

PocitacoveSiete/Webserver (last edited 2008-12-03 22:40:58 by GejzaJenca)