Enseignements

Python Projet

Projet a rendre

Vous devez rendre le projet au plus tard Samedi 16 octobre 2010 la derniere semaine d’octobre. Vous presenterz individuellement par oral votre projet le lundi 18 octobre matin la semaine du premier Novembre.

Le but du projet est de réaliser deux programmes Python avec interface graphique qui communiquent entre eux via une connection socket TCP.

11-oct-2010 : Quelques précisions sur le cahier des charges: Dans sa version minimale (ce qu’il faut faire pour avoir juste la moyenne), il faut que le client soit capable d’envoyer des données une seule fois. Dans sa version complète (ce qu’il faut faire pour essayer d’avoir la note maximum), le programme client retransmet au fur et à mesure les caractères saisis par l’utilisateur vers le serveur, qui les affiche aussi au fur et à mesure. Dans cette version complète, le client et le serveur doivent donc s’échanger un nombre quelconque de messages, jusqu’à ce que le client se termine (quand l’utilisateur clique sur le bouton quitter, par exemple).

Le projet peut etre réalisé indifféremment sur Linux ou Windows

Fournitures

Pour faciliter la réalisation du projet, vous pouvez commencer en utilisant une version pre-compilée de la classe Server décrite ci-après.

Vous trouverez ci-apres deux archives, l’une contenant la version compilée pour Python2.6.6 et l’autre pour Python 2.7. Choisissez celle qui convient a la version de Python que vous utilisez:

Vous devez simplement deposez le fichier Server.pyc qui se trouve dans l’archive dans le répertoire dans lequel vous allez travailler sur le projet.

Conseils/Mises en garde

Attention, si vous utilisez IDLE, vous ne pouvez pas lancer DEUX applications différentes qui utilisent en même temps la bibliothèque graphique Tkinter/Pmw.

Conseil: mettez au point le premier programme avec IDLE (par exemple le coté serveur) puis lorsque vous passez au deuxième programme, n’utilisez plus IDLE mais lancez a la main le programme en ligne de commande (soit à partir de l’invite de commande Unix, soit au prompt du shell Unix).

Structure du programme et methodologie

Il est fortement conseillé de découper le problème en sous-problèmes de la facon suivante:

  1. Etudier la classe Server fournie (code précompilé): utilisez la fonction d’aide de python pour consulter la documentaion de cette classe:
    1. import Server
    2. help(Server)
      Remarquez en particulier la présence de methodes non-bloquantes. Ces methodes sont indispensable car le serveur doit surveiller simulatnement deux choses: l’arrivee de nouveau messages en provenance du client, et les evenements graphiques (appel à mainloop de Tk)
  2. Construire l’interface graphique du coté serveur. Il vaut mieux commencer par le serveur que par le client car vous pouvez simuler un client a l’aide de la commane telnet (ou putty) alors que l’inverse est impossible.
  3. Tester l’interface graphique du serveur avec telnet
  4. Construire l’interface graphique du client
  5. Tester le client avec le serveur

Pour la zone du texte du serveur, vous pouvez utiliser un widget Pmw.ScrolledText. Pour les zones de saisie de texte et du numero de port du client, vous pouvez utiliser un widget EntryField. Notez que les widgets EntryField permettent de faire des vrifiactions sur le contenu (par exemple verifier que le numero de port est bien un entier). Vous pouvez utiliser autant de boutons que vous voulez, par exemple un bouton Quitter, un bouton Accept pour accepter une conncetion d ‘un client sur le serveur, un bouton connect sur le client, et un bouton Close pour fermer une connection ouverte, etc.

Trucs et Astuces

Avec Tkinter/Pmw, vous pouvez forcer l’execution d’une methode apres un certain delai en utilisant la primitive after d’un widget ou de la fenetre racine.

Par exemple:
tmid = server.root.after(100,update)
déclenche l’execution de la methode update() apres 100 milisecondes.

Tres pratique pour verifier regulierement s’il y a des choses en attente de lecture sur le socket.

Attention, il faut reprogrammer l’attente a chaque fois que le delai expire. Par exemple dans l’exemple precedent, si on a programme l’execution de la methode update apres 100 miliseconde, si on veut que cette methode s’execute a nouveau 100 ms plus tard, il faut ajouter l’insctruction after à la fin de la methode update().

Exemple:

class ServerWin:
   def __init__(self,port)
      self.root = Tinter.Tk()

   def update(self):
      line = self.serv.readline(False) # lecture non bloquante
      # ...
      self.root.after(100,self.update)
 

Vous pouvez annuler l’execution differee par after() en utilisant la methode after_cancel(id) ou id est le resultat de l’appel a after() que vous voulez annuler. Donc pour annuler l’appel de l’exemple precedent:
server.root.after_cancel(tmid)

Question Bonus

Ceux qui s’en sentent capables peuvent essayer de reécrire la classe Server qui vous est fournie, sachant que le truc a connaitre pour rendre un appel non-bloquant est d’utiliser la primitive select.select afin de verifier si la prochaine operation de lecture est susceptible de bloquer. En effet, rappelez-vous que l’appel est bloquant lorsqu’il n’y a rien a lire sur un socket. Donc pour eviter de se bloquer en lecture, ce qui a pour effet de geler totalement l’application, il suffit d’eviter de faire une lecture quand le socket n’a rien à lire. Et donc, il faut savoir quand un socket a ou n’a pas quelque chose à lire, avant de commencer la lecture…

Bareme

  • client : 10 points
  • interface graphique serveur : 10 points
  • code de la classe serveur : bonus, jusqu’a 6 points.

Pour avoir la note de 10/20 (sans tenir compte du bonus), il suffit que votre programme arrive a lire au moins un caractere dans la fenetre du client, le transmette du cote du serveur par le socket et que la fentre graphique du serveur affiche ce caractere.

Pour avoir 20/20, vous devez faire un programme qui fonctionne parfaitement, est programmé de façon propre en utilisant la programmation objet (faites des classes!), avec des noms de fonctions et de variables explicites (évitez i, j et k!) et il DOIT être correctement documenté (Python a prévu un mécanisme de documentation intégré, utilisez-le!).

Avertissement a titre préventif…

Attention, la copie est strictement interdite et passible de lourdes sanctions. Ce travail doit etre fait de façon INIVIDUELLE. En cas de plagiarisme intégral ou partiel (copie sur un autre etudiant, ou recopie de code trouve sur internet), tous les etudiants concernés seront sanctionnés à l’identique. Rappelons par ailleurs que l’Université sanctionne très lourdement les cas de fraude aux examens.

Page d’Accueil

Enseignements 2017-18

Enseignements Antérieurs

Recherche…

edit SideBar

Blix theme adapted by David Gilbert, powered by PmWiki