Le Coin Wiki
d'Olivier Dalle
$WikiTagline
 

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 raliser deux programmes Python avec interface graphique qui communiquent entre eux via une connection socket TCP.

11-oct-2010 : Quelques prcisions 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 donnes une seule fois. Dans sa version complte (ce qu’il faut faire pour essayer d’avoir la note maximum), le programme client retransmet au fur et mesure les caractres saisis par l’utilisateur vers le serveur, qui les affiche aussi au fur et mesure. Dans cette version complte, 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 ralis indiffremment sur Linux ou Windows

Fournitures

Pour faciliter la ralisation du projet, vous pouvez commencer en utilisant une version pre-compile de la classe Server dcrite ci-aprs.

Vous trouverez ci-apres deux archives, l’une contenant la version compile 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 rpertoire dans lequel vous allez travailler sur le projet.

Conseils/Mises en garde

Attention, si vous utilisez IDLE, vous ne pouvez pas lancer DEUX applications diffrentes qui utilisent en mme temps la bibliothque graphique Tkinter/Pmw.

Conseil: mettez au point le premier programme avec IDLE (par exemple le cot serveur) puis lorsque vous passez au deuxime 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 dcouper le problme en sous-problmes de la facon suivante:

  1. Etudier la classe Server fournie (code prcompil): utilisez la fonction d’aide de python pour consulter la documentaion de cette classe:
    1. import Server
    2. help(Server)
      Remarquez en particulier la prsence 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)
dclenche 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 recrire 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 faon 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 prvu un mcanisme de documentation intgr, utilisez-le!).

Avertissement a titre prventif…

Attention, la copie est strictement interdite et passible de lourdes sanctions. Ce travail doit etre fait de faon INIVIDUELLE. En cas de plagiarisme intgral ou partiel (copie sur un autre etudiant, ou recopie de code trouve sur internet), tous les etudiants concerns seront sanctionns l’identique. Rappelons par ailleurs que l’Universit sanctionne trs lourdement les cas de fraude aux examens.