Enseignements

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:

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 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):

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 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

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

Page d’Accueil

Enseignements 2017-18

Enseignements Antérieurs

Recherche…

edit SideBar

Blix theme adapted by David Gilbert, powered by PmWiki