Documentation
ClientServeur
Remarques de MsieurHappy:
Et donc ça gère pas les messages multilignes ?
(18:54:41) MsieurHappy: Le «CLIENT» on est obligé de l'envoyer ? Quand faut-il l'envoyer ? Peut-on en envoyer plusieurs ? Comment gérer si un paquet contient plusieurs fois le même attribut ?
Le serveur est à l'écoute sur un port (12345 par défaut) et le client vient s'y connecter.
Exemple de paquet:
Le premier mot de chaque paquet est nommé "en tête" et caractérise le type du paquet (et donc son rôle)
Les mots suivants sont découpés en deux morceaux (séparés par le caractère '=') Le premier morceau du mot constitue l'attribut du mot, le second constitue la valeur.
Exemple: dans le mot suivant, nick représente l'attribut, et Edouard la valeur.
L'ordre des mots dans le paquet ne joue pas, excepté pour le header qui est toujours en première position.
Si un attribut est représenté plusieurs fois dans un paquet, le paquet sera rejeté et ignoré.
De même si il manque un attribut attendu, le paquet sera ignoré.
En revanche si un paquet comporte des attributs non-attendu, ceux ci seront simplement ignorés mais le reste du paquet sera utilisé.
Exemple:
Exemple:
Exemple:
Exemple:
Exemple:
Il possède un attribut: state pour l'état dans lequel on souhaite passer (idle,ready,pause ou reset)
Exemple:
Il n'est pas obligatoire est peut être envoyé à tout moment.
Il possède deux attributs: version pour la version du client (2.0, 2.0 web, 0.5 android, etc) et os pour l'os utilisé
Exemple:
Il possède sept attributs: id pour notre identifiant sur le salon, auth pour notre code d'authentification (utilisé en cas de reconnexion), lang pour la langue utilisé pour jouer, chat (yes ou no) pour l'autorisation ou non du chat sur le salon, min pour le nombre de lettres que doivent avoir les mots au minimum, pf (yes ou no) pour savoir si le filtrage parental est activé, mode pour le mode de jeu (all -> tous les mots comptent, trad -> seuls les mots que j'ai été le seul à trouver comptent.)
Exemple:
Il possède un seul attribut qui est la raison invoquée pour le refus de la connexion. (server_full,bad_auth...)
Exemple:
Il possède huit attributs: lang pour la langue utilisé pour jouer, chat (yes ou no) pour l'autorisation ou non du chat sur le salon, min pour le nombre de lettres que doivent avoir les mots au minimum, pf (yes ou no) pour savoir si le filtrage parental est activé, mode pour le mode de jeu, nb pour le nombre de joueurs présents actuellement, max pour le nombre maximum de joueurs sur le salon, et name pour le nom du salon. (all -> tous les mots comptent, trad -> seuls les mots que j'ai été le seul à trouver comptent.)
Exemple:
Il possède trois attributs: nick pour le nom du joueur, logo pour l'identifiant de son avatar, et id pour l'identifiant du joueur sur le salon (par la suite le joueur est adressé uniquement par son identifiant sur le salon.
Exemple:
Il possède un seul attribut: id pour l'identifiant du joueur sur le salon.
Exemple:
Il possède deux attributs: id pour l'identifiant du joueur, et state pour pour son état (idle,ready,pause ou reset)
Exemple:
Il possède deux attributs: id pour l'identifiant de l'émetteur (0 si l'émetteur est le serveur), et msg pour le contenu du message
Exemple:
Il possède deux attributs: id pour l'identifiant du joueur concerné, et score pour la valeur du score.
Exemple:
Il possède deux attributs: max qui est le nombre total de points de cette grille, et grid qui est une chaine de caractère contenant les 16 lettres de la grille dans l'ordre suivant:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Exemple:
Il possède deux attributs: rem pour le temps restant en secondes, et tot pour le temps total de la partie.
Exemple:
Exemple:
Il possède deux attributs: id pour l'identifiant du joueur concerné, et prog pour le pourcentage. (ce pourcentage correspond au nombre de mots que le joueur a trouvé divisé par le nombre total de mots trouvés par l'ensemble des joueurs)
Exemple:
Exemple:
Il possède trois attributs: id pour l'identifiant du joueur concerné, score pour son score à cette partie, et words pour la liste des mots qu'il a trouvé.
Exemple:
Concepts généraux
Les communications entre un client et le serveur se font au travers d'un socket TCP.Le serveur est à l'écoute sur un port (12345 par défaut) et le client vient s'y connecter.
Paquets de données
Les échanges à l'intérieur du socket se font par "paquets" de caractères, un paquet étant délimité d'un autre par un retour chariot (caractère \n).Mots dans les paquets
L'intérieur d'un paquet est découpé en mots séparés par le caractère '|'. Par conséquent ce caractère est interdit dans les mots, et ne pourra être échappé. (est-ce un problème ?)Exemple de paquet:
JOIN|nick=Edouard|logo=0\n
Les mots suivants sont découpés en deux morceaux (séparés par le caractère '=') Le premier morceau du mot constitue l'attribut du mot, le second constitue la valeur.
Exemple: dans le mot suivant, nick représente l'attribut, et Edouard la valeur.
nick=Edouard
Si un attribut est représenté plusieurs fois dans un paquet, le paquet sera rejeté et ignoré.
De même si il manque un attribut attendu, le paquet sera ignoré.
En revanche si un paquet comporte des attributs non-attendu, ceux ci seront simplement ignorés mais le reste du paquet sera utilisé.
Déroulement d'une connexion
On peut distinguer deux phases dans la connexion entre un client et un serveur: la phase de négociation, puis la phase de jeu.Phase de négociation
C'est l'étape ou le client demande a être connecté au salon (même si la socket est "physiquement" déjà connectée!), ou reconnecté dans le cas d'une connexion interrompue brusquement.Phase de jeu
Tout le reste de la connexion. Une phase de jeu peut être interrompue par deux moyens: perte du réseau et donc du socket, ou bien envoi par le client d'un paquet de déconnexion.Liste des paquets client -> serveur
Phase de négociation uniquement
- CONNECT
Exemple:
CONNECT|nick=Edouard|logo=3
- RECONNECT
Exemple:
RECONNECT|auth=45RT76TR|id=124
- PING
Exemple:
PING|
Phase de jeu uniquement
- WORD
Exemple:
WORD|word=pointu
- CHAT
Exemple:
CHAT|msg=Bonjour tout le monde!
- STATUS
Il possède un attribut: state pour l'état dans lequel on souhaite passer (idle,ready,pause ou reset)
Exemple:
STATUS|state=ready
- CLIENT
Il n'est pas obligatoire est peut être envoyé à tout moment.
Il possède deux attributs: version pour la version du client (2.0, 2.0 web, 0.5 android, etc) et os pour l'os utilisé
Exemple:
CLIENT|version=2.0 web|os=GNU/Linux
Liste des paquets serveur -> client
Phase de négociation uniquement
- ACCEPT
Il possède sept attributs: id pour notre identifiant sur le salon, auth pour notre code d'authentification (utilisé en cas de reconnexion), lang pour la langue utilisé pour jouer, chat (yes ou no) pour l'autorisation ou non du chat sur le salon, min pour le nombre de lettres que doivent avoir les mots au minimum, pf (yes ou no) pour savoir si le filtrage parental est activé, mode pour le mode de jeu (all -> tous les mots comptent, trad -> seuls les mots que j'ai été le seul à trouver comptent.)
Exemple:
ACCEPT|id=654|auth=45RT76TR|lang=fr|chat=yes|min=3|pf=no|mode=trad
- DENY
Il possède un seul attribut qui est la raison invoquée pour le refus de la connexion. (server_full,bad_auth...)
Exemple:
DENY|reason=server_full
- PING
Il possède huit attributs: lang pour la langue utilisé pour jouer, chat (yes ou no) pour l'autorisation ou non du chat sur le salon, min pour le nombre de lettres que doivent avoir les mots au minimum, pf (yes ou no) pour savoir si le filtrage parental est activé, mode pour le mode de jeu, nb pour le nombre de joueurs présents actuellement, max pour le nombre maximum de joueurs sur le salon, et name pour le nom du salon. (all -> tous les mots comptent, trad -> seuls les mots que j'ai été le seul à trouver comptent.)
Exemple:
PING|lang=fr|chat=yes|min=3|pf=no|mode=trad|nb=5|max=10|name=le salon officiel
Phase de jeu uniquement
- JOIN
Il possède trois attributs: nick pour le nom du joueur, logo pour l'identifiant de son avatar, et id pour l'identifiant du joueur sur le salon (par la suite le joueur est adressé uniquement par son identifiant sur le salon.
Exemple:
JOIN|nick=Edouard|logo=3|id=654
- LEAVE
Il possède un seul attribut: id pour l'identifiant du joueur sur le salon.
Exemple:
LEAVE|id=654
- STATUS
Il possède deux attributs: id pour l'identifiant du joueur, et state pour pour son état (idle,ready,pause ou reset)
Exemple:
STATUS|id=654|state=ready
- CHAT
Il possède deux attributs: id pour l'identifiant de l'émetteur (0 si l'émetteur est le serveur), et msg pour le contenu du message
Exemple:
CHAT|id=657|msg=Bonjour Edouard, comment vas tu ?
- SCORE
Il possède deux attributs: id pour l'identifiant du joueur concerné, et score pour la valeur du score.
Exemple:
SCORE|id=657|score=210
- START
Il possède deux attributs: max qui est le nombre total de points de cette grille, et grid qui est une chaine de caractère contenant les 16 lettres de la grille dans l'ordre suivant:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Exemple:
START|grid=BAGGLEBAGGLEBAGG|max=78
- TIME
Il possède deux attributs: rem pour le temps restant en secondes, et tot pour le temps total de la partie.
Exemple:
TIME|rem=87|tot=180
- WORD
Exemple:
WORD|word=pointu|status=not_in_grid
- PROGRESS
Il possède deux attributs: id pour l'identifiant du joueur concerné, et prog pour le pourcentage. (ce pourcentage correspond au nombre de mots que le joueur a trouvé divisé par le nombre total de mots trouvés par l'ensemble des joueurs)
Exemple:
PROGRESS|id=657|prog=35
- STOP
Exemple:
STOP|nb=4
- RESULT
Il possède trois attributs: id pour l'identifiant du joueur concerné, score pour son score à cette partie, et words pour la liste des mots qu'il a trouvé.
Exemple:
RESULT|id=657|score=4|words=une,tel,ces,ses

B@ggle