proposez un service distant qui fonctionne en
deux phases. À la connexion, le client fournit son nom et sa date de naissance. Ensuite, le client peut demander
au serveur le jour (lundi, mardi, etc.) de sa naissance ou son age. Il reçoit alors une chaîne en guise de réponse,
indiquant « Toto, tu es né(e) un ... » ou « Toto, tu as XX ans » . Le client peut également clore la connexion.
Pour gérer les calculs de date, nous proposons d'utiliser l'API Joda time, livrée avec le JDK 1.8. Pour initialiser
une date donnée, il suffit d'écrire :
LocalDate date=[login to view URL]("xx/xx/xxxx",[login to view URL]("d/M/uuuu"));
Pour trouver le jour correspondant, il suffit d'écrire :
DayOfWeek day=[login to view URL]();
String dayname=[login to view URL]([login to view URL],[login to view URL]);
Un age peut se récupérer immédiatement :
int age=[login to view URL](date,[login to view URL]()).getYears();
Pour la requête de connexion, il faut fournir à la fois un nom, mais aussi une date : pour le transfert
d'information, on utilisera une classe dédiée à la date, contenant trois entiers (day,month,year). En particulier, on
n'utilisera pas de type Java prédéfini (type Date, Calendar ou LocalDate), car ces données sont complexes et
empêcheront l'utilisation d'autre environnement que Java.
Une fois la connexion établie, le dialogue est assez simple : les requêtes n'ont pas de paramètres et les réponses
sont toujours sous la forme d'une chaîne de caractères.
Pour transférer les données, nous n'utiliserons pas la sérialisation de Java, mais utiliserons le codage JSON
plutôt. Pour cela, il faut incorporer la bibliothèque gson de Google (.jar fourni sur UPdago) dans votre code afin
de transférer vos données entre le client et le serveur. La conversion fonctionne de la manière suivante :
import [login to view URL];
import [login to view URL];
…
Gson gson = new GsonBuilder().setPrettyPrinting().create(); // setPrettyPrinting() optionnel
String s=[login to view URL](unobjet); // Convertit un objet en chaîne JSON
UneClasse unobjet=[login to view URL](s,[login to view URL]); // Convertit une chaîne JSON en objet
Attention, concernant cette dernière ligne, l'objet construit est une instanciation uniquement de la classe donnée
en paramètre (UneClass), même si c'est un objet d'une sous-classe qui a été envoyé1 ; les attributs
supplémentaires trouvés dans la chaîne JSON sont tout simplement ignorés. Si on veut prendre également en
compte les attributs de la sous-classe, il faut ré-appeler la conversion, avec comme second paramètre la sousclasse.
Les données JSON à transmettre étant nécessairement des chaînes de caractères, nous pouvons opter pour deux solutions pour les faire transiter dans la socket. Il n’est pas question ici d’utiliser la sérialisation de la classe
String puisque la transmission serait cantonnée aux applications Java. Nous transmettrons une chaîne à un
format standard, sous la forme d’une série d’octets (un octet par caractère), la longueur du message étant la
longueur de la chaîne (sa taille n’est donc pas transmise). Afin de gérer de façon transparente les caractères
accentués et non ASCII en général, nous utiliserons l’encodage UTF-8.
La première solution, bas niveau, repose sur l’utilisation de buffer d’octets et utilise directement les flux de base
InputStream et OutputStream sans encapsulation dans des flux plus puissants. On utilisera les transformations
suivantes (voir exemple de base dans le cours) :
byte[] buffer=[login to view URL]("UTF-8"); // codage de s en une série d'octets codés en UTF-8
s=new String(buffer,0,size,"UTF-8"); // Reconstruction à partir d'une série d'octets
Bonjour,
Il y a 4 ans, j'ai eu à réaliser un exercice similaire à l'école (42) en C. On avait 2h pour le faire.
Si j'avais à le refaire en totale liberté, je le ferais plutôt en JS ou en PHP pour la facilité et la rapidité. Mais si vous avez absolument besoin que ce soit fait en Java, aucun souci, je peux aussi.