Python V 2 TP 5
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:
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 précédent.
Retour en haut de la feuille d’exercice
Exercice 3: Un serveur web concurrent?
Dans les exemples précédents, 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 simultanées peut être très élevé. Cela se traduit par une lenteur désagréable, voire inacceptable du serveur. Pour parer à ce problème, une idée 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 père accepte les connections, puis qu’il crée un processus fils pour traîter chaque nouvelle connection.
Le petit programme suivant illustre comment créer un processus fils en python sur un système Unix (Linux, MACOS):
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 création de processus se fait de façon très différents sous windows ou la primitive fork() n’existe pas (le problème 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 expliquées, 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)
Complétez ci-après dans les zones prévues à cet effet les
parties manquantes de ce module (signalées par le commentaire
>>> PARTIE A COMPLETER
), de façon à 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
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)