GithubHelp home page GithubHelp logo

reseau's People

Contributors

tanguycauquil avatar thibautlanier avatar victorlohezic avatar

Watchers

 avatar  avatar

reseau's Issues

Implémentation de la commande bye  [Déconnexion]

log out
< bye

Si au bout d'un certain temps, le contrôleur ne reçoit aucun message d'un programme d’affichage, celui-ci est supprimé de l’aquarium. Pour éviter d’être considéré comme déconnecté par le contrôleur, il est donc nécessaire de le contacter à intervalles réguliers. On utilisera pour cela une commande Ping.

list ls [Demande continue de Poisson]

Deux commandes peuvent être utilisées : ls et getFishesContinuously
La commande ls empile toutes les réponses en une seule fois. Ici ils retournent 3 lignes directement. La commande getFishesContinuously permet de retourner les réponses de manière périodique dans la connexion TCP/IP ouverte.

ls
< list [PoissonRouge at 92x40,10x4,5] [PoissonClown at 22x80,12x6,5]
< list [PoissonRouge at 70x40,10x4,5] [PoissonClown at 10x90,12x6,5]
< list [PoissonRouge at 30x30,10x4,5] [PoissonClown at 30x30,12x6,5]

Le contrôleur retourne au programme d’affichage la liste des poissons que doit gérer ce dernier en continu, ici 3 réponses sont générées directement et qui prennent en compte les aspects de mobilité des poissons.
A noter que le contrôleur peut communiquer a priori le chemin complet que doit prendre un poisson en suivant des points bien précis. Dans ce cas, le programme d’affichage doit parser toutes les positions et les exécuter une à la suite des autres.

Commande status

-> OK: Connecté au controleur, X poissons trouvés
Fish [NomFish] at [PosFish],[SizeFish]
...

Implémentation de la commande log out [Déconnexion]

log out
< bye

Si au bout d'un certain temps, le contrôleur ne reçoit aucun message d'un programme d’affichage, celui-ci est supprimé de l’aquarium. Pour éviter d’être considéré comme déconnecté par le contrôleur, il est donc nécessaire de le contacter à intervalles réguliers.

Implémentation de la commande pong [Déconnexion]

Si au bout d'un certain temps, le contrôleur ne reçoit aucun message d'un programme d’affichage, celui-ci est supprimé de l’aquarium. Pour éviter d’être considéré comme déconnecté par le contrôleur, il est donc nécessaire de le contacter à intervalles réguliers. On utilisera pour cela une commande Ping :

ping 12345
< pong 12345

Implémentation de la méthode list [Demande périodique de poissons]

Première demande

getFishes
< list [PoissonRouge at 90x4,10x4,5] [PoissonClown at 20x80,12x6,5]
Le contrôleur retourne au programme d’affichage la liste des poissons que doit gérer ce dernier.
Ici le programme d’affichage courant doit gérer deux poissons : PoissonRouge et PoissonClown. Le PoissonRouge doit nager depuis sa position courante vers la position 90x4 (en pourcentage de la taille de l’écran). Cette mobilité (ou cette nage) doit durer 5s. A noter que les paramètres de mobilité entre la position actuelle du poisson et sa nouvelle position sont à la discrétion de chaque programme d’affichage. Le contrôleur ne fait que communiquer la position finale (i.e. 90x4)du poisson et la durée d’exécution de la mobilité (5s).
Attention: les coordonnées peuvent être négatives dans le cas d’un poisson qui entre ou sort de la vue de l’afficheur.
Pour afficher instantanément un poisson à une position par exemple lorsqu’il rentre dans une vue, la valeur de temps est mise à 0 . list [PoissonRouge at 90x4,10x4,0] [PoissonClown at 20x80,12x6,5] ⇒ ici PoissonRouge s’affiche dès la réception de cette commande à la position indiquée.

Supprimer un poisson

$ delFish PoissonNain
-> OK
$ delFish PoissonNain3
-> NOK : Poisson inexistant

Implémentation de la méthode greeting [Initialisation et authentification]

hello in as ID
< greeting ID
À l'initialisation, le programme d’affichage communique au contrôleur son identifiant qui doit correspondre à un vrai nœud dans la topologie de l’aquarium, c’est à dire un afficheur (exemple N1 , N2, N3 ou N4). L’identifiant est fixé au démarrage du programme d’affichage ou lu depuis le fichier de configuration.

Si l'identifiant demandé est libre (c’est à dire pas pris par un autre clientà, le contrôleur autorise son utilisation.

hello in as N3
< greeting N3

Si le programme d’affichage n'a pas spécifié d'identifiant, le contrôleur lui attribue un identifiant libre (le reste de la commande n’est pas nécessaire dans ce cas).

hello
< greeting N2
Si l'identifiant demandé n'existe pas dans la topologie, ou lorsqu’il est déjà attribué à un autre affichage, le contrôleur renvoie si possible un autre identifiant libre sinon une erreur

hello in as N404
< greeting N4

hello in as N505
< no greeting

Ajouter deux méthodes dans le client

Image

  • InitNetwork qui initialise la connection du client avec la socket et instancie les différentes commandes dans le dictionnaire

  • closeNetwork qui ferme la connection du client avec la socket

Implémentation de la commande ping  [Déconnexion]

Si au bout d'un certain temps, le contrôleur ne reçoit aucun message d'un programme d’affichage, celui-ci est supprimé de l’aquarium. Pour éviter d’être considéré comme déconnecté par le contrôleur, il est donc nécessaire de le contacter à intervalles réguliers. On utilisera pour cela une commande Ping :

ping 12345
< pong 12345

Ajouter un poisson

$ addFish PoissonNain at 61x52, 4x3, RandomWayPoint
-> OK
$ addFish PoissonNain2 at 45x4, 10x10, PathWay
-> NOK : modèle de mobilité non supporté

list getFishesContinuously [Demande continue de Poisson]

Les algorithmes de déplacement (RandomPathWay par exemple) sont à destination du contrôleur: il détermine la façon dont le serveur va déplacer le poisson : une nouvelle position toutes les 5 secondes par exemple. On pourra imaginer un algorithme HorinzontalPathWay qui fait qu’un poisson se déplace toujours horizontalement et toujours dans le même sens (il devrait ainsi tourner entre les clients).
Concernant  getFishesContinuously, plusieurs solutions sont possibles côté contrôleur:

getFishesContinuously
< list [PoissonRouge at 92x40,10x4,5] [PoissonClown at 22x80,12x6,5]
// 3 seconds après par exemple le contrôleur transmet une nouvelle liste.
< list [PoissonRouge at 70x40,10x4,5] [PoissonClown at 10x90,12x6,5]
// 3 seconds après par exemple le contrôleur transmet une nouvelle liste.
< list [PoissonRouge at 30x30,10x4,5] [PoissonClown at 30x30,12x6,5]
Dans cet exemple, le contrôleur envoie un “liste” chaque fois qu’un poisson arrive à destination (ici au bout de 5 secondes). On pourrait également implémenter un contrôleur qui envoie une “list” toutes les 3 secondes:
getFishesContinuously
< list [PoissonRouge at 92x40,10x4,5] [PoissonClown at 22x80,12x6,3]
< list [PoissonRouge at 70x40,10x4,4] [PoissonClown at 10x90,12x6,2]
< list [PoissonRouge at 30x30,10x4,3] [PoissonClown at 30x30,12x6,1]
Du point de vue du client, cela ne devrait pas changer l’implémentation. Dans le deuxième cas, on confirme les destinations régulièrement, ce que l’on ne fait pas dans le premier cas.

getFishesContinuously [Demande continue de Poisson ]

Les algorithmes de déplacement (RandomPathWay par exemple) sont à destination du contrôleur: il détermine la façon dont le serveur va déplacer le poisson : une nouvelle position toutes les 5 secondes par exemple. On pourra imaginer un algorithme HorinzontalPathWay qui fait qu’un poisson se déplace toujours horizontalement et toujours dans le même sens (il devrait ainsi tourner entre les clients).
Concernant  getFishesContinuously, plusieurs solutions sont possibles côté contrôleur:

getFishesContinuously
< list [PoissonRouge at 92x40,10x4,5] [PoissonClown at 22x80,12x6,5]
// 3 seconds après par exemple le contrôleur transmet une nouvelle liste.
< list [PoissonRouge at 70x40,10x4,5] [PoissonClown at 10x90,12x6,5]
// 3 seconds après par exemple le contrôleur transmet une nouvelle liste.
< list [PoissonRouge at 30x30,10x4,5] [PoissonClown at 30x30,12x6,5]
Dans cet exemple, le contrôleur envoie un “liste” chaque fois qu’un poisson arrive à destination (ici au bout de 5 secondes). On pourrait également implémenter un contrôleur qui envoie une “list” toutes les 3 secondes:
getFishesContinuously
< list [PoissonRouge at 92x40,10x4,5] [PoissonClown at 22x80,12x6,3]
< list [PoissonRouge at 70x40,10x4,4] [PoissonClown at 10x90,12x6,2]
< list [PoissonRouge at 30x30,10x4,3] [PoissonClown at 30x30,12x6,1]
Du point de vue du client, cela ne devrait pas changer l’implémentation. Dans le deuxième cas, on confirme les destinations régulièrement, ce que l’on ne fait pas dans le premier cas.

Création d'un fichier de configuration Affichage.cfg

Adresse IP du nœud contrôleur

controller-address = a.b.c.d

Identifiant du programme d'affichage

id = N1

Numéro de port TCP d'écoute du nœud contrôleur

controller-port = 12345

Valeur par défaut pour la transmission du ping.

display-timeout-value = 30

Répertoire relatif ou absolu où se trouve les visuels pour les poissons.

resources = ./fishes

Implémentation de la méthode getFishes [Demande périodique de poissons]

getFishes
< list [PoissonRouge at 90x4,10x4,5] [PoissonClown at 20x80,12x6,5]
Le contrôleur retourne au programme d’affichage la liste des poissons que doit gérer ce dernier.
Ici le programme d’affichage courant doit gérer deux poissons : PoissonRouge et PoissonClown. Le PoissonRouge doit nager depuis sa position courante vers la position 90x4 (en pourcentage de la taille de l’écran). Cette mobilité (ou cette nage) doit durer 5s. A noter que les paramètres de mobilité entre la position actuelle du poisson et sa nouvelle position sont à la discrétion de chaque programme d’affichage. Le contrôleur ne fait que communiquer la position finale (i.e. 90x4)du poisson et la durée d’exécution de la mobilité (5s).
Attention: les coordonnées peuvent être négatives dans le cas d’un poisson qui entre ou sort de la vue de l’afficheur.
Pour afficher instantanément un poisson à une position par exemple lorsqu’il rentre dans une vue, la valeur de temps est mise à 0 . list [PoissonRouge at 90x4,10x4,0] [PoissonClown at 20x80,12x6,5] ⇒ ici PoissonRouge s’affiche dès la réception de cette commande à la position indiquée.

Création d'un fichier configuration controller.cfg

Numéro de port TCP d'écoute

controller-port = 12345

Temps entre 2 requêtes au-delà duquel un programme d’affichage est retiré du réseau.

display-timeout-value = 45

Intervalle en secondes pour l'échange périodique de poisson. cf. commande GetFishesContinuously

fish-update-interval = 1

ls [Demande continue de Poisson]

Deux commandes peuvent être utilisées : ls et getFishesContinuously
La commande ls empile toutes les réponses en une seule fois. Ici ils retournent 3 lignes directement. La commande getFishesContinuously permet de retourner les réponses de manière périodique dans la connexion TCP/IP ouverte.

ls
< list [PoissonRouge at 92x40,10x4,5] [PoissonClown at 22x80,12x6,5]
< list [PoissonRouge at 70x40,10x4,5] [PoissonClown at 10x90,12x6,5]
< list [PoissonRouge at 30x30,10x4,5] [PoissonClown at 30x30,12x6,5]

Le contrôleur retourne au programme d’affichage la liste des poissons que doit gérer ce dernier en continu, ici 3 réponses sont générées directement et qui prennent en compte les aspects de mobilité des poissons.
A noter que le contrôleur peut communiquer a priori le chemin complet que doit prendre un poisson en suivant des points bien précis. Dans ce cas, le programme d’affichage doit parser toutes les positions et les exécuter une à la suite des autres.

Lecture du fichier de configuration du client

Peut être judicieux de crée une classe gestionnaire de configuration qui va permettre la création de fichier de configurations et la lecture de configuration
A réfléchir, il faut surtout pouvoir répondre à cette question : dans le fichier de configuration pour la vue, il met l'id de la vue, ça veut dire qu'il faut en créer, à la main, un pour chaque vue ?

L'idée est de pouvoir récupérer les différentes variables du fichier de configuration pour la vue :

# Adresse IP du nœud contrôleur
controller-address = a.b.c.d

# Identifiant du programme d'affichage
id = N1

# Numéro de port TCP d'écoute du nœud contrôleur
controller-port = 12345

# Valeur par défaut pour la transmission du ping.
display-timeout-value = 30

# Répertoire relatif ou absolu où se trouve les visuels pour les poissons.
resources = ./fishes

Conception UML prompt et commandes

Réaliser une proposition de l’organisation des classes pour le contrôleur.

On doit pouvoir avoir une interface de type prompt qui se chargera essentiellement du parsing :

  • lire le terminal
  • comprendre l'instruction demandée et exécuter l'instruction
  • envoyer des informations à l'utilisateur dans le terminal après avoir exécutée l'instruction

L'exécution d'une instruction peut se faire son la forme d'une "commande". Cela permettra notamment de coder des instructions. Une commande possède :

  • un nom
  • des paramètres
  • un résultat de retour
  • une fonction

La commande peut réaliser des instructions du protocole de communication interne. Il faut donc aussi réfléchir à la forme que ces instructions peuvent prendre.

L'idée est que l'on puisse coder des commandes et des instructions du protocole de communication interne sans savoir comment la communication avec le terminal fonctionne.
De plus, on doit pouvoir coder des instruction du protocole de communication interne sans connaître les commandes.

Conception schémas prompt et commandes

Réaliser une proposition de l’organisation des interfaces .h pour la vue.

On doit pouvoir avoir une interface de type prompt qui se chargera essentiellement du parsing :

  • lire le terminal
  • comprendre l'instruction demandée et exécuter l'instruction
  • envoyer des informations à l'utilisateur dans le terminal après avoir exécutée l'instruction

L'exécution d'une instruction peut se faire son la forme d'une "commande". Cela permettra notamment de coder des instructions. Une commande possède :

  • un nom
  • des paramètres
  • un résultat de retour
  • une fonction

La commande peut réaliser des instructions du protocole de communication interne. Il faut donc aussi réfléchir à la forme que ces instructions peuvent prendre.

L'idée est que l'on puisse coder des commandes et des instructions du protocole de communication interne sans savoir comment la communication avec le terminal fonctionne.
De plus, on doit pouvoir coder des instruction du protocole de communication interne sans connaître les commandes.

Affichage de la topologie

Commande :
show aquarium

Retour :
1000x1000
N1 0x0+500+500
N2 500x0+500+500
N3 0x500+500+500
N4 500x500+500+500

Implémentation de la méthode hello [Initialisation et authentification]

hello in as ID
< greeting ID
À l'initialisation, le programme d’affichage communique au contrôleur son identifiant qui doit correspondre à un vrai nœud dans la topologie de l’aquarium, c’est à dire un afficheur (exemple N1 , N2, N3 ou N4). L’identifiant est fixé au démarrage du programme d’affichage ou lu depuis le fichier de configuration.

Si l'identifiant demandé est libre (c’est à dire pas pris par un autre clientà, le contrôleur autorise son utilisation.

hello in as N3
< greeting N3

Si le programme d’affichage n'a pas spécifié d'identifiant, le contrôleur lui attribue un identifiant libre (le reste de la commande n’est pas nécessaire dans ce cas).

hello
< greeting N2
Si l'identifiant demandé n'existe pas dans la topologie, ou lorsqu’il est déjà attribué à un autre affichage, le contrôleur renvoie si possible un autre identifiant libre sinon une erreur

hello in as N404
< greeting N4

hello in as N505
< no greeting

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.