Le premier TP ne contient que des exercices faisant intervenir un schéma de communication basique entre un client et un serveur. Il n'y a en effet pas vraiment de notion de requête pour demander différents services au serveur. Cette notion est pourtant essentielle. Par exemple, dès lors qu'un objet connecté doit faire plus que donner son état à un serveur, il est nécessaire qu'il puisse envoyer différents type de requêtes au serveur.
Ce deuxième TP permet de découvrir "en douceur" un exemple simple de client/serveur à base de requêtes.
Créer un fichier Position.java grâce au code suivant.
import java.io.*;
public class Position {
private double x,y,z;
public Position() {
x = 0; y = 0; z = 0;
}
public Position(double x, double y, double z) {
this.x = x; this.y = y; this.z = z;
}
public String toString() {
String msg = x+","+y+","+z;
return msg;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public double getZ() {
return z;
}
public Position clone() {
return new Position(x,y,z);
}
public boolean equals(Position p, double eps) {
if ( (Math.abs(p.x-x)>eps)||(Math.abs(p.y-y)>eps)||(Math.abs(p.z-z)>eps) ) return false;
return true;
}
public double distanceTo(Position p) {
double d = 0.0;
// à compléter : calcul la distance entre la position courante et p
return d;
}
}
Créer un fichier PositionServer.java qui va faire différents calculs sur les positions qu'un client lui a envoyé.
PrintStream et un BufferedReader grâce à la socket de communication obtenue,Position dans un ArrayList. Pour cette requête :
"1","OK" si l'opération s'est bien passée, soit "ERR_REQ" s'il n'y a pas 3 valeurs fournies ou/et elles n'ont pas le bon format (i.e. nombre à virgule)"2",eps dans la classe Position). Pour cette requête :
"3","TRUE" si c'est le cas, "FALSE" sinon. De plus, s'il n'y a pas assez de paramètres ou bien qu'ils ne sont pas au bon format, le serveur renvoie "ERR_REQ"Créer un fichier java PositionClient.java.
PrintStream et un BufferedReader grâce à la socket de communication,NB : dans ce TP, le serveur n'accepte qu'un seul client à la fois. Cet exercice permet de mettre en place ce qu'il est nécessaire pour gérer plusieurs clients, sans toutefois aller à la mise en place de connexions simultanées.
HashMap<Integer, ArrayList<Position> > pour stocker les positions des clients qui se sont connectés. La clé de type Integer représente l'identifiant de chaque client."NOID_ERR". Cela permet au client de différencier le type d'erreur quand elle a lieu.Modifier le client pour qu'il soit interactif, par exemple en utilisant le canevas de code donné en cours. Les requêtes sont donc tapées au clavier par l'utilisateur et doivent avoir le format suivant :
storepos x,y,z.pathlenfindpos facteur_proximité,x,y,z.Le client doit se charger de vérifier que les lignes tapées par l'utilisateur suivent ces format et de transformer ces lignes en une requête auprès du serveur.
Par exemple, si l'utilisateur tape : "storepos 1.5,3,-2", le client va envoyer une requête n°1 en envoyant une ligne contenant "1", puis une ligne contenant "id_client,1.5,3,-2", où id_client doit être remplacé par l'identifiant client donné par le serveur.