Le Coin Wiki
d'Olivier Dalle
$WikiTagline
 

Exercice 1: un premier serveur

Expliquez ce que fait le programme suivant et comment on pourrait le tester partir de la ligne de commande du shell Unix:

import select, socket, sys, msvcrt

host = ''
port = 50013
backlog = 5
size = 1024
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host,port))
server.listen(5)

client, address = server.accept()
client_host,client_port = address
print "connection TCP depuis %s on port %d"%(client_host,client_port)

line = client.recv(1024)
while line:
    print line
    line = client.recv(1024)

print line
client.close()

server.close()

Retour en haut de la feuille d’exercice

Exercice 2: un client maison

Ecrivez un programme python qui fait le travail de la commande telnet que vous avez utilis dans l’exercice prcdent.

Retour en haut de la feuille d’exercice

Exercice 3: Un serveur web concurrent?

Dans les exemples prcdents, lorsque le processus est occup lire un socket de transfert, il n’est pas disponible pour accepter une connection, et vice-versa. Dans le cas d’un serveur web, le nombre de connections simultanes peut tre trs lev. Cela se traduit par une lenteur dsagrable, voire inacceptable du serveur. Pour parer ce problme, une ide classique consiste construire un serveur multi-processus: au lieu de faire faire tout le travail un seul processus, on fait appel plusieurs processus. Par exemple, on peut faire en sorte que seul le processus pre accepte les connections, puis qu’il cre un processus fils pour trater chaque nouvelle connection.

Le petit programme suivant illustre comment crer un processus fils en python sur un systme Unix (Linux, MACOS):

import sys, os

pid = os.fork()
if pid == 0:
    getp = os.getpid()
    pere = os.getppid()
    print "je suis le processus fils: pid=%d, getp=%d, pere=%d"%(pid, getp, pere)
    sys.exit(0)
else:
    getp = os.getpid()
    pere = os.getppid()
    print "je suis le processus fils: pid=%d, getp=%d, pere=%d"%(pid, getp, pere)
    sys.exit(0)

Malheureusement, la cration de processus se fait de faon trs diffrents sous windows ou la primitive fork() n’existe pas (le problme ne vient pas de Python, mais de Windows qui n’est pas conforme a la norme POSIX). Les plus curieux d’entre-vous peuvent aller voir cette page o les differences sont expliques, ainsi que nombre d’autres choses a propos du module os, que nous n’avons malheureusement pas el temps de voir ensemble…

Retour en haut de la feuille d’exercice

Exercice 4 (tir de l’examen 2008-2009)

Compltez ci-aprs dans les zones prvues cet effet les parties manquantes de ce module (signales par le commentaire >>> PARTIE A COMPLETER ), de faon reproduire exactement l’affichage qui suit, en prenant garde d’viter toute duplication de code inutile :

exo3~> python ExoClass.py
Vous faites erreur, je ne suis qu’un animal virtuel !

Je suis un ExtraTerrestre et a ma connaissance j’ai les attributs suivants:
- 7 yeux
- Un(e) malheureux(se) bras (pour dire bonjour)
- 72 pattes
- Un paquet de antennes

Je suis un Elephant et a ma connaissance j’ai les attributs suivants:
- 2 yeux
- 4 pattes
- 2 grandes oreilles
- Un(e) malheureux(se) trompe

class AnimalVirtuel:
  def __init__(self,kind="Virtual"):
    self.kind = kind
    self.membres = []
  def addAttributs(self,kind,number):
    self.membres.append((kind,number))
  def __str__(self):
    return "Vous faites erreur, je ne suis qu'un animal virtuel !\n"

class AnimalReel(AnimalVirtuel):
  def __init__(self,kind):
    AnimalVirtuel.__init__(self,kind)  
  def __str__(self):
    # PARTIE A COMPLETER (voir l'nonc)

class Elephant(AnimalReel):
    # PARTIE A COMPLETER (voir l'nonc)

if __name__ == "__main__":
  a= AnimalVirtuel()
  print(a)
  r= AnimalReel("ExtraTerrestre")
  r.addAttributs("yeux", 7)
  r.addAttributs("bras (pour dire bonjour)", 1)
  r.addAttributs("pattes", 72)
  r.addAttributs("antennes", 0)
  print(r)
  e = Elephant()
  print(e)

Retour en haut de la feuille d’exercice